• toc {:toc}

문제 ν™•μΈν•˜κΈ°

1713: 후보 μΆ”μ²œν•˜κΈ° 문제 ν™•μΈν•˜κΈ°

풀이

이 λ¬Έμ œμ—μ„œ ν’€μ–΄μ•Ό ν•  지점은 3λ²ˆμ΄λ‹€.

  1. λΉ„μ–΄μžˆλŠ” 사진틀이 μ—†λŠ” κ²½μš°μ—λŠ” ν˜„μž¬κΉŒμ§€ μΆ”μ²œ 받은 νšŸμˆ˜κ°€ κ°€μž₯ 적은 ν•™μƒμ˜ 사진을 μ‚­μ œν•˜κ³ , κ·Έ μžλ¦¬μ— μƒˆλ‘­κ²Œ μΆ”μ²œλ°›μ€ ν•™μƒμ˜ 사진을 κ²Œμ‹œν•œλ‹€. μ΄λ•Œ, ν˜„μž¬κΉŒμ§€ μΆ”μ²œ 받은 νšŸμˆ˜κ°€ κ°€μž₯ 적은 학생이 두 λͺ… 이상일 κ²½μš°μ—λŠ” κ·ΈλŸ¬ν•œ 학생듀 쀑 κ²Œμ‹œλœ μ§€ κ°€μž₯ 였래된 사진을 μ‚­μ œν•œλ‹€.
  • λΉ„μ–΄μžˆλŠ” 사진틀이 μ—†λŠ” 경우 μΆ”μ²œ μˆ˜κ°€ κ°€μž₯ 적은 학생을 μ°ΎλŠ” μ•Œκ³ λ¦¬μ¦˜
  • μΆ”μ²œ μˆ˜κ°€ 동일할 경우 κ°€μž₯ 였래된 학생 선택

recommend 배열은 μΆ”μ²œ 횟수λ₯Ό μ„ΈλŠ” λ°°μ—΄, check λ°°μ—΄μ—μ„œ 학생이 사진틀에 λ½‘νžŒ 경우λ₯Ό 확인할 뿐만 μ•„λ‹ˆλΌ oldλ₯Ό μ‚¬μš©ν•΄μ„œ 였래된 μˆœμ„œλ₯Ό λ‚˜νƒ€λ‚Έλ‹€.

이 λΆ€λΆ„ κ΅¬ν˜„μ΄ λ˜μ—ˆλ‹€λ©΄ λ‚˜λ¨Έμ§€ 뢀뢄은 문제 κ·ΈλŒ€λ‘œ ν’€μ΄ν•˜λ©΄ λœλ‹€.

λ‹€λ§Œ, 사진틀에 μžˆλŠ” 학생이 μΆ”μ²œλ°›μ•˜μ„ λ•Œ oldλŠ” κ°±μ‹ λ˜μ§€ μ•ŠλŠ”λ‹€.

#include <bits/stdc++.h>
using namespace std;
#define X first
#define Y second
 
int recommend[105];     // μΆ”μ²œ 횟수
int check[105];         // 사진틀에 λ“€μ–΄μ™”λŠ”μ§€ μ—¬λΆ€ 체크
vector<int> frame;
 
int main(){
    ios::sync_with_stdio(true);
    cin.tie(0); cout.tie(0);
 
    int N, size, num, old = 0;
    check[104] = 99999;
 
    cin >> N;
    
    size = N;
 
    cin >> N;
    for(int i = 0; i < N; i++){
        cin >> num;
        old++;
 
        // Frame이 μ±„μ›Œμ Έ μžˆλŠ” μƒνƒœμ—μ„œ μƒˆλ‘œμš΄ 후보가 λ“€μ–΄μ˜¨ 경우
        if (frame.size() == size && !check[num-1]){
            int idx = -1;
            pair<int, int> min = {104, 99999};
            for (int k=0; k<frame.size(); k++){
                int n = frame[k];
                // ν˜„μž¬κΉŒμ§€ μΆ”μ²œμˆ˜κ°€ κ°€μž₯ 적은 학생 μΆ”μΆœ
                if (min.Y > recommend[n-1]) {
                    idx = k;
                    min.X = n;
                    min.Y = recommend[n-1];
                }
                // μΆ”μ²œμˆ˜κ°€ 동일할 λ•Œ 였래된 학생 μΆ”μΆœ
                else if (min.Y == recommend[n-1]){
                    if (check[min.X-1] > check[n-1]){
                        idx = k;
                        min.X = n;
                        min.Y = recommend[n-1];
                    } 
                }
            }
            recommend[min.X-1] = 0;
            check[min.X-1] = 0;
 
            frame[idx] = num;
            recommend[num-1]++;
            check[num-1] = old;
        }
        // 사진틀에 μžˆλŠ” 후보가 μΆ”μ²œμ„ 받은 경우
        else if (check[num-1]){
            recommend[num-1]++;
        }
        else{
            recommend[num-1]++;
            check[num-1] = old;
            frame.push_back(num);
        }
    }
 
    sort(frame.begin(), frame.end());
 
    for (int i : frame){
        cout << i << " ";
    }
 
    return 0;
}