백준: Silver③ - 1343, 1359, 1388, 1417

2 분 소요


</br> 계속 풀이
</br>

1343: 폴리오미노

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

XX.XXXXXXXXXX…XXXXXX 같은 거 BB.AAAAAAAABB…AAAABB 처럼 채우기

    s += '.';
    vector<int> v;
    int prev = -1;
    for(int i = 0; i < s.size(); i++){
        if( s[i] == '.' ){
            int cnt = i-prev-1;
            if( cnt != 0 ){
                if( cnt % 2 != 0 ){
                    cout << -1 << endl;
                    return 0;
                }
                v.push_back(cnt);
            }
            prev = i;
        }
    }
    int ind = 0;
    for(int i = 0; i < s.size()-1; i++){
        if( s[i] == '.' ){
            cout << '.';
            continue;
        }
        int Xs = v[ind++];
        i += Xs-1;
        while( Xs ){
            if( Xs/4 ){
                cout << "AAAA";
                Xs -= 4;
            }
            else{
                cout << "BB";
                Xs -= 2;
            }
        }
    }

XX 덩어리들을 나눠서 저장한다. 저장할 때 그 크기가 2로 나누어 떨어지지 않는다면 -1을 출력하고 바로 끝낸다.
이후 출력할 때, XX 덩어리의 크기에 따라 AAAA를 최대한 채우고 BB를 출력한다.
</br>

1359: 복권

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

n개 중에 m개 골라서 k개가 같으면 당첨

    int p = comb(n, m);
    int c = 0;
    while( m >= k ){
        if( n-m < m-k ){
            k++;
            continue;
        }
        c += comb(m, k) * comb(n-m, m-k);
        k++;
    }
    cout << (double)c / (double)p << endl;

(m개 중 k개 고르기) * (n-m개 중 m-k개 고르기)의 합 / (n개 중 m개 고르기) k일 때, k+1일 때, … 를 다 더해 주면 된다.
</br>

1388: 바닥 장식

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

장판 몇 갠지 세기

    for(int i = 0; i < n; i++){
        string s;
        cin >> s;
        for(int j = 0; j < m; j++){
            if( s[j] == '-' ) mmap[i][j] = 0;
            else mmap[i][j] = 1;
        }
    }
    int cnt = 0;
    for(int i = 0; i < n; i++){
        for(int j = 0; j < m-1; j++){
            if( mmap[i][j] == 0 && mmap[i][j+1] == 1 ) cnt++;
        }
        if( mmap[i][m-1] == 0 ) cnt++;
    }
    for(int i = 0; i < m; i++){
        for(int j = 0; j < n-1; j++){
            if( mmap[j][i] == 1 && mmap[j+1][i] == 0 ) cnt++;
        }
        if( mmap[n-1][i] == 1 ) cnt++;
    }
    cout << cnt << endl;

가로 방향으로 확인하면서, 만약 세로 장판을 만난다면 카운트를 증가한다.
마찬가지로 세로 방향으로 확인하면서, 만약 가로 장판을 만난다면 카운트를 증가했다.
</br>

1417: 국회의원 선거

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

매수해서 내가 표 제일 많이 얻기

    priority_queue<int, vector<int>, less<int>> pq;

    int n;
    cin >> n;
    int ds;
    cin >> ds;

    for(int i = 1; i < n; i++){
        int a;
        cin >> a;
        pq.push(a);
    }
    if( pq.size() == 0 ){
        cout << 0 << endl;
        return 0;
    }
    int cnt = 0;
    while( ds <= pq.top() ){
        int t = pq.top();
        pq.pop();
        cnt++;
        ds++;
        pq.push(t-1);
    }
    cout <<cnt << endl;

다솜이의 점수를 따로 저장하고, 나머지는 우선순위 큐에 넣는다.
한 표 씩 매수하면서, 만약 우선순위 큐의 맨 앞보다 다솜이가 더 크다면 매수를 종료한다.
</br>


재밌다 재밌어
이제 좀 한 방에 맞추기 시작한다
</br>

댓글남기기