πŸ’  Cpp

[BOJ][C++] λ°±μ€€ 2849번: ν–‰μš΄μ˜ 바퀴

선달 2024. 3. 6. 17:03
λ°˜μ‘ν˜•

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

 

2840번: ν–‰μš΄μ˜ 바퀴

첫째 쀄에 λ§ˆμ§€λ§‰ νšŒμ „μ—μ„œ ν™”μ‚΄ν‘œκ°€ κ°€λ¦¬ν‚€λŠ” λ¬ΈμžλΆ€ν„° μ‹œκ³„λ°©ν–₯으둜 바퀴에 적어놓은 μ•ŒνŒŒλ²³μ„ 좜λ ₯ν•œλ‹€. μ΄λ•Œ, μ–΄λ–€ κΈ€μžμΈμ§€ κ²°μ •ν•˜μ§€ λͺ»ν•˜λŠ” 칸은 '?'λ₯Ό 좜λ ₯ν•œλ‹€. λ§Œμ•½, 상덕이가 적어놓

www.acmicpc.net

 

 

문제

μƒλ•μ΄λŠ” μ΅œκ·Όμ— ν–‰μš΄μ˜ 바퀴λ₯Ό κ΅¬λ§€ν–ˆλ‹€. μƒλ•μ΄λŠ” λ°”ν€΄μ˜ 각 칸에 μ•ŒνŒŒλ²³ λŒ€λ¬Έμžλ₯Ό μ•„λž˜ κ·Έλ¦Όκ³Ό 같이 μ μ—ˆλ‹€.

 

바퀴에 같은 κΈ€μžλŠ” 두 번 이상 λ“±μž₯ν•˜μ§€ μ•ŠλŠ”λ‹€. 또, λ°”ν€΄λŠ” μ‹œκ³„λ°©ν–₯으둜만 λŒμ•„κ°„λ‹€. 바퀴 μ˜†μ—λŠ” ν™”μ‚΄ν‘œκ°€ μžˆλŠ”λ°, 이 ν™”μ‚΄ν‘œλŠ” 항상 ν•œ 곳을 가리킀고 있으며, λŒμ•„κ°€λŠ” λ™μ•ˆ κ°€λ¦¬ν‚€λŠ” κΈ€μžλŠ” λ°”λ€Œκ²Œ λœλ‹€. μœ„μ˜ κ·Έλ¦Όμ—μ„œλŠ” Hλ₯Ό 가리킀고 μžˆλ‹€.

μƒλ•μ΄λŠ” 바퀴λ₯Ό μ—°μ†ν•΄μ„œ K번 돌릴 것이닀. 맀번 바퀴λ₯Ό 돌릴 λ•Œ λ§ˆλ‹€, μƒλ•μ΄λŠ” ν™”μ‚΄ν‘œκ°€ κ°€λ¦¬ν‚€λŠ” κΈ€μžκ°€ λ³€ν•˜λŠ” νšŸμˆ˜μ™€ μ–΄λ–€ κΈ€μžμ—μ„œ νšŒμ „μ„ λ©ˆμΆ”μ—ˆλŠ”μ§€λ₯Ό 쒅이에 μ λŠ”λ‹€.

ν¬μ›μ΄λŠ” 상덕이가 적어놓은 쒅이λ₯Ό λ°œκ²¬ν–ˆλ‹€. κ·Έ 쒅이λ₯Ό λ°”νƒ•μœΌλ‘œ 상덕이가 바퀴에 적은 μ•ŒνŒŒλ²³μ„ μ•Œμ•„λ‚΄λ €κ³  ν•œλ‹€.

상덕이가 쒅이에 적어놓은 λ‚΄μš©κ³Ό λ°”ν€΄μ˜ 칸의 μˆ˜κ°€ μ£Όμ–΄μ‘Œμ„ λ•Œ, 바퀴에 적어놓은 μ•ŒνŒŒλ²³μ„ μ•Œμ•„λ‚΄λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

 

풀이

11%μ—μ„œ ν‹€λ ΈμŠ΅λ‹ˆλ‹€ κ°€ λœ¬λ‹€λ©΄

바퀴에 같은 κΈ€μžλŠ” 두 번 이상 λ“±μž₯ν•˜μ§€ μ•ŠλŠ”λ‹€.

γ„΄ μš” 쑰건을 μž‘μ•„λƒˆλŠ”μ§€ μƒκ°ν•˜μž

 

λ°˜λ‘€

4 4
1 A
1 B
1 C
1 A

 

 

μ½”λ“œ

#include <iostream>
#include <vector>

using namespace std;

string solution(int n, int k) {
    vector<bool> alphabetUsed(26, false); // μ‚¬μš©λœ μ•ŒνŒŒλ²³ ν‘œμ‹œ
    vector<char> wheel(n,'?'); // 바퀴 λ°°μ—΄ 기본값은 λ¬ΌμŒν‘œ
    
    int roll, cur=0; char c;
    for(int i=0; i<k; i++) { // 돌렀돌렀 돌림판
        cin >> roll >> c;
        
        cur += roll;
        cur %= n;
        
        // 같은 칸도 μ•„λ‹Œλ° 이미 μ“΄ μ•ŒνŒŒλ²³μΈ 경우
        if(wheel[cur]!=c && alphabetUsed[c-'A']) {
            return "!";
        }
        
        // 같은 칸도 μ•„λ‹Œλ° 이미 무언가 μ¨μžˆμ„ 경우
        if(wheel[cur]!=c && wheel[cur]!='?')  {
            return "!";
        }
        
        wheel[cur] = c;
        alphabetUsed[c-'A'] = true;
    }
    
    string ans = "";
    for(int i=0; i<n; i++) {
        ans += wheel[((cur-i)+n)%n];
    }
    
    return ans;
}

int main() {
    int n,k;
    cin >> n >> k;
    
    cout << solution(n,k);
    
    return 0;
}
λ°˜μ‘ν˜•