백준: Gold5② - 1038, 1068, 1089

2 분 소요


</br> 계속 계속
</br>

1038: 감소하는 수

https://www.acmicpc.net/problem/1038

https://cyj893.github.io/algorithm/Algorithm9_3/
이 문제는 전에 푼 문제랑 똑같아서 패스한다
인덱스만 달라짐…
</br>

1068: 트리

https://www.acmcpc.net/problem/1068

오랜만에 보는 트리 문제다~~ 어떤 노드를 삭제했을 때 리프 노드는 몇 개일 지 세기

vector<int> v[51];
int del[51];
void func(int d){
    del[d] = 1;
    for(int i = 0; i < v[d].size(); i++){
        func(v[d][i]);
    }
}

// in main()
    for(int i = 0; i < n; i++){
        int a;
        cin >> a;
        if( a == -1 ) continue;
        v[a].push_back(i);
    }
    cin >> k;
    func(k);
    int cnt = 0;
    for(int i = 0; i < n; i++){
        if( del[i] == 0 ){
            cnt++;
            if( v[i].size() != 0 ){
                for(int t : v[i]){
                    if( !del[t] ){
                        cnt--;
                        break;
                    }
                }
            }
        }
    }
    cout << cnt << endl;

근데 트리를 구현할 필요는 없는 문제다
일단 입력 받을 때 벡터 배열에 자식들을 푸시해서 저장해 놓는다
그 다음 재귀 함수로 자식 노드들을 다 방문하며 del[]에 삭제 되었다고 표시한다.
이후 삭제되지 않은 노드들을 방문하며, 자식이 하나도 없는 지를 확인하고 카운트하면 된다

참고로 처음 입력이 무조건 -1이 아니다… 그래서 한 번 틀림ㅜ
</br>

1089: 스타트링크 타워

https://www.acmcpc.net/problem/1089

디지털 숫자의 전구가 꺼졌을 수도 있을 때 가능한 수들의 평균 구하기

#include <bits/stdc++.h>
#define R "..#"
#define L "#.."
#define LR "#.#"
#define A "###"

using namespace std;

vector<string> nums[10] = { {A, LR, LR, LR, A},
                           {R, R, R, R, R},
                           {A, R, A, L, A},
                           {A, R, A, R, A},
                           {LR, LR, A, R, R},
                           {A, L, A, R, A},
                           {A, L, A, LR, A},
                           {A, R, R, R, R},
                           {A, LR, A, LR, A},
                           {A, LR, A, R, A}    };
vector<string> v[10];
vector<int> cannum[10];

int main() {
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cout.precision(11);

    int n;
    cin >> n;

    for(int i = 0; i < 5; i++){
        string s;
        cin >> s;
        string t = s.substr(0, 3);
        v[0].push_back(t);
        for(int j = 1; j < n; j++){
            t = s.substr(3*j+j, 3);
            v[j].push_back(t);
        }
    }

    for(int ind = 0; ind < n; ind++){
        vector<string> t = v[ind];
        for(int i = 0; i < 10; i++){
            bool b = true;
            for(int j = 0; j < 5; j++){
                for(int k = 0; k < 3; k++){
                    if( t[j][k] == '#' && nums[i][j][k] == '.' ){
                        b = false;
                        break;
                    }
                }
                if( !b ) break;
            }
            if( b ) cannum[ind].push_back(i);
        }
    }
    double ans = 0;
    for(int i = 0; i < n; i++){
        int sz = cannum[i].size();
        if( cannum[i].size() == 0 ){
            cout << -1 << endl;
            return 0;
        }
        double sum = 0;
        int p = pow(10, n-i-1);
        for(int a : cannum[i]){
            sum += a;
        }
        sum = sum / sz;
        ans += sum*p;
    }
    cout << ans << endl;
}

와~~ 귀찮은 문제 아두이노 할 때 이런 거 비슷한 거 했었는데
0~9 까지 일단 string을 저장해 두고, 입력 받은 문자가 그 숫자를 만들 수 있는 지 확인한다
그다음 가능한 숫자들로 만들 수 있는 수들의 합의 평균 구하기
ex) 1111, 1113, 1114 ...와 같이 가능한 조합을 다 구하고 더하기는 귀찮을 것 같아서, 각 자리마다 평균을 내서 더해주는 식으로 구했다.
</br>


현재 143문제를 풀고 학교 랭킹 130등이다
지금 탑 100에 들려면 190문제는 풀어야 한다 갈 길이 머네
매일 10문제 풀면 일주일 안에 되긴 할 텐데 음
</br>

댓글남기기