코딩테스트/BOJ

[BOJ] 2840 행운의 바퀴 - JAVA

5월._. 2022. 2. 20.
728x90

1. 문제

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

 

2840번: 행운의 바퀴

첫째 줄에 마지막 회전에서 화살표가 가리키는 문자부터 시계방향으로 바퀴에 적어놓은 알파벳을 출력한다. 이때, 어떤 글자인지 결정하지 못하는 칸은 '?'를 출력한다. 만약, 상덕이가 적어놓

www.acmicpc.net


2. 풀이

같은 알파벳이 여러 개 있을 수 없으므로 26칸 boolean배열을 만든다. 룰렛 배열은 ?로 초기화한다. 

룰렛을 시계방향으로 돌린다는 건 반시계방향으로 화살표가 글자를 가리킨다는 뜻이다. 따라서 글자가 몇 번 바뀌었는지 받고 %N을 한 뒤에 (idx+N-(S%N))%N을 idx에 다시 저장한다. 현재 인덱스+N을 해준 건 %N을 해주었을 때 음수가 나오지 않게 하기 위한 것이다.

구한 인덱스에 ch가 저장돼있다면 다음으로 넘어간다.

다른 알파벳이 저장되어있지않고('?') ch가 다른 룰렛에 등장한 적 없다면 룰렛에 ch를 저장하고 알파벳을 사용처리한다.

이 경우가 아니라면 '!'를 출력하고 메인함수를 완전히 끝낸다.

public static void main(String[] args) throws IOException {
   BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
   StringTokenizer st = new StringTokenizer(in.readLine());
   int N = Integer.parseInt(st.nextToken());
   int K = Integer.parseInt(st.nextToken());

   boolean[] alphabet = new boolean[26];

   char[] roulette = new char[N];
   Arrays.fill(roulette, '?');

   int idx = 0;
   while (--K >= 0) {
      st = new StringTokenizer(in.readLine());
      idx = (idx + N - (Integer.parseInt(st.nextToken()) % N)) % N;
      char ch = st.nextToken().charAt(0);

      if (roulette[idx] == ch) continue;

      if (roulette[idx] == '?' && !alphabet[ch-'A']) {
         roulette[idx] = ch;
         alphabet[ch-'A'] = true;
      }
      else {
         System.out.println('!');
         return;
      }
   }

   StringBuilder sb = new StringBuilder();
   for (int i = 0; i < N; i++) {
      sb.append(roulette[(idx + i) % N]);
   }
   System.out.println(sb);
}

3. 결과

'코딩테스트 > BOJ' 카테고리의 다른 글

[BOJ] 2606 바이러스 - JAVA  (0) 2022.02.20
[BOJ] 1260 DFS와 BFS - JAVA  (0) 2022.02.20
[BOJ] 1063 킹 - JAVA  (0) 2022.02.20
[BOJ] 15683 감시 - JAVA  (0) 2022.02.20
[BOJ] 3060 욕심쟁이 돼지 - JAVA  (0) 2022.02.18

댓글