파게로그

[백준 2840번] 행운의 바퀴 본문

콤퓨타 왕왕기초/PS

[백준 2840번] 행운의 바퀴

파게 2021. 4. 13. 05:19

문제 링크: 2840번 행운의 바퀴

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

 

크기가 n인 배열을 선언하고 rot번 돌렸을 때 해당 위치에 문자를 삽입해주며,

%을 이용해서 맨 뒤 칸 다음 맨 앞 칸이 나올 수 있도록 한다.

실제로는 환형이므로 arrow의 초기값은 0이 아니라도 관계없다.

 

상덕이가 적어놓은 종이에 해당하는 행운의 바퀴가 없는 경우는 다음과 같다.

① 같은 칸에 다른 문자가 등장할 경우 → 비어있지 않은 칸일 경우 체크

② 이미 등장한 문자가 다른 위치에 등장할 경우 → discover[] 배열로 해결

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int[] nm = Arrays.stream(br.readLine().split(" ")).mapToInt(Integer::parseInt).toArray();
        int n = nm[0];
        int k = nm[1];

        char[] wheel = new char[n]; // 바퀴
        Arrays.fill(wheel, '?');
        int arrow = 0; // 화살표
        boolean[] discover = new boolean['Z'-'A'+1];
        boolean possible = true;

        for (int i = 0; i < k; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            int rot = Integer.parseInt(st.nextToken());
            char alpha = st.nextToken().charAt(0);

            arrow = (arrow + rot) % n;

            if (wheel[arrow] != '?' && wheel[arrow] != alpha || wheel[arrow] != alpha && discover[alpha-'A']) {
                possible = false;
                break;
            }

            wheel[arrow] = alpha;
            discover[alpha-'A'] = true;
        }

        if (possible) {
            StringBuilder answer = new StringBuilder();
            int t = arrow;
            for (int i = 0; i < n; i++) {
                t = arrow - i;
                if (t < 0) t += n;
                answer.append(wheel[t]);
            }
            System.out.print(answer);
        } else {
            System.out.print('!');
        }
    }
}

 

Comments