백준 문제 풀이/백준 (JAVA)

JAVA 백준 2840 행운의 바퀴 (구현)

gamja00 2025. 5. 15. 22:08

 

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

 


문제

  1. 첫째 줄에 바퀴 칸의 수 N과 바퀴를 돌리는 횟수 K ( 2 <= N <= 25, 1 <= K <= 100  ) 이 입력된다.
  2. 둘째 줄부터 K 줄에 바퀴를 회전시켰을 때 화살표가 가리키는 글자가 몇 번 바뀌었는지를 나타내는 S ( 1 <= S <= 100 )와 회전을 멈추었을 때 가리키던 글자가 주어진다.
  3. 회전판을 시계방향으로만 돌릴 때 상덕이가 종이에 적은 정보 K개를 이용하여 바퀴에 적힌 글자를 알아내야 된다.
  4. 회전판에는 같은 글자는 존재하지 않고, 모든 글자를 모두 채우고 빈 칸이 있다면 ?로 빈칸을 채워 출력하도록 한다.
  5. 만약 한 칸에 다른 알파벳 두 개가 들어가는 상황이 생길 때는 !를 출력하여 행운의 바퀴가 없음을 나타내도록 한다.

 

 

정답 코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        StringTokenizer st = new StringTokenizer(br.readLine());

        int N = Integer.parseInt(st.nextToken());
        int K = Integer.parseInt(st.nextToken());

        String[] list = new String[N];
        int index = N - 1;
        boolean flag = false;

        HashSet<String> alphabetList = new HashSet<>();

        for (int i = 0; i < K; i++) {
            st = new StringTokenizer(br.readLine());

            int num = Integer.parseInt(st.nextToken());
            String alphabet = st.nextToken();

            for (int j = 0; j < num; j++) {
                index--;
                if (index == -1) {
                    index = N - 1;
                }
            }

            if (list[index] == null && !alphabetList.contains(alphabet)) {
                list[index] = alphabet;
                alphabetList.add(alphabet);
            } else if (Objects.equals(list[index], alphabet)) {
                list[index] = alphabet;
            } else {
                flag = true;
                break;
            }
        }

        if (flag) {
            System.out.println("!");
            return;
        }

        StringBuilder sb = new StringBuilder();

        for (int i = 0; i < N; i++) {
            if (index == N) {
                index = 0;
            }
            if (list[index] == null) {
                sb.append("?");
            } else {
                sb.append(list[index]);
            }
            index++;
        }

        System.out.println(sb);
    }
}

 

 

문제가 어렵진 않은데 실버 문제 치고는 조건이 좀 복잡한 것 같다.

 

신경써야 될 부분은

1. 시계방향으로 돌려야 된다는 부분. ( 배열의 끝부터 시작하여 앞으로 나아간다. )

2. 마지막에 가리킨 문자부터 시계방향으로 바퀴에 적은 알파벳을 출력. ( 마지막에 가리킨 문자부터 배열의 끝 방향으로 가며 배열의 끝과 시작이 원형으로 연결된 것처럼 인덱스를 이동하여 모든 문자열을 출력하도록 한다. )

정도 되는 것 같다.

 

이외에 범위만 잘 조절해주면 쉬운 문제인데 조건만 좀 신경쓰면 될 것 같다.