[ 백준 ] 2840 / 행운의 바퀴

金弘均·2021년 9월 13일
0

Baekjoon Online Judge

목록 보기
1/228
post-thumbnail

# Appreciation

/*
 * Problem :: 2840 / 행운의 바퀴
 * 
 * Kind :: Simulation
 * 
 * Insight
 * - 처음에 어떤 칸부터 시작하는 건지 알 수가 없다
 *   맨 마지막에 도착한 칸부터 거꾸로 생각해야겠다
 *   (그러고보니 문제도 도착한 칸부터 시계방향으로 출력해야 된다)
 *   + 예제 입력 3
 *     8 8
 *     4 V / HONITAVR / idx = (3+3) % 8 = 6
 *     3 I / HONITA?R / idx = (4+7) % 8 = 3
 *     7 T / HON?TA?R / idx = (5+7) % 8 = 4
 *     7 A / HON??A?R / idx = (7+6) % 8 = 5
 *     6 R / HON????R / idx = (2+5) % 8 = 7
 *     5 N / HON????? / idx = (1+1) % 8 = 2
 *     1 O / HO?????? / idx = (0+9) % 8 = 1
 *     9 H / H??????? / idx = 0
 *     # 마지막 회전에서 가리키는 글자(H)를 idx=0 으로 잡고
 *       다시 반시계방향으로 회전(idx 증가)시켜서 도착한 칸에 그 이전 회전의 문자를 기록해준다
 *       이를 반복해주면서 바퀴의 글자들을 최대한 찾아주자
 *
 * Point
 * - 바퀴에 같은 글자는 두 번 이상 등장하지 않는다
 *   + 이미 바퀴에 기록된 글자는 사용할 수 없다
 *     # https://www.acmicpc.net/board/view/26362
 *       4 4
 *       1 A / AAAA
 *       1 A / AAA?
 *       1 A / AA??
 *       1 A / A???
 *       -> 그러나 같은 글자가 2번 이상 쓰였기에
 *          위에 해당하는 바퀴는 없다!
 */

# Code

//
//  BOJ
//  ver.C++
//
//  Created by GGlifer
//
//  Open Source

#include <iostream>
#include <cstring>
#include <map>

using namespace std;

#define endl '\n'

// Set up : Global Variables
/* None */

// Set up : Functions Declaration
/* None */


int main()
{
    // Set up : I/O
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    // Set up : Input
    int N, K;
    cin >> N >> K;
    int S[K]; char C[K];
    for (int i=0; i<K; i++)
        cin >> S[i] >> C[i];

    // Process
    char A[N]; memset(A, '?', sizeof(A)); /* 초기 바퀴 */
    map<char,bool> isUsed;
    int idx = 0; /* 인덱스 초기화 */
    A[idx] = C[K-1]; /* 바퀴 초기화 */

    bool isValid = true;
    for (int i=K-1; i>=1; i--) {
        /* 마지막 회전부터 반시계 방향 회전 */
        idx += S[i];
        idx %= N;

        /* 아직 글자가 안써진 칸에 이미 바퀴에 사용된 글자를 적어야 한다면 */
        if (A[idx] == '?' && isUsed[C[i-1]]) {
            isValid = false; /* 그러한 바퀴는 없음 */
            break;
        }
        /* 글자가 써진 칸에 다른 글자를 적어야 한다면 */
        if (A[idx] != '?' && A[idx] != C[i-1]) {
            isValid = false; /* 그러한 바퀴는 없음 */
            break;
        }

        A[idx] = C[i-1]; /* 해당 칸에 글자 기록 */
        isUsed[C[i-1]] = true; /* 글자 사용 처리 */
    }

    // Control : Output
    cout << ((isValid) ? string(A, A+N) : "!") << endl;
}

// Helper Functions
/* None */
profile
이런 미친 게임을 봤나! - 옥냥이

0개의 댓글