백준 문제 풀이/백준 (JAVA)
JAVA 백준 2840 행운의 바퀴 (구현)
gamja00
2025. 5. 15. 22:08
https://www.acmicpc.net/problem/2840
문제
- 첫째 줄에 바퀴 칸의 수 N과 바퀴를 돌리는 횟수 K ( 2 <= N <= 25, 1 <= K <= 100 ) 이 입력된다.
- 둘째 줄부터 K 줄에 바퀴를 회전시켰을 때 화살표가 가리키는 글자가 몇 번 바뀌었는지를 나타내는 S ( 1 <= S <= 100 )와 회전을 멈추었을 때 가리키던 글자가 주어진다.
- 회전판을 시계방향으로만 돌릴 때 상덕이가 종이에 적은 정보 K개를 이용하여 바퀴에 적힌 글자를 알아내야 된다.
- 회전판에는 같은 글자는 존재하지 않고, 모든 글자를 모두 채우고 빈 칸이 있다면 ?로 빈칸을 채워 출력하도록 한다.
- 만약 한 칸에 다른 알파벳 두 개가 들어가는 상황이 생길 때는 !를 출력하여 행운의 바퀴가 없음을 나타내도록 한다.
정답 코드
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. 마지막에 가리킨 문자부터 시계방향으로 바퀴에 적은 알파벳을 출력. ( 마지막에 가리킨 문자부터 배열의 끝 방향으로 가며 배열의 끝과 시작이 원형으로 연결된 것처럼 인덱스를 이동하여 모든 문자열을 출력하도록 한다. )
정도 되는 것 같다.
이외에 범위만 잘 조절해주면 쉬운 문제인데 조건만 좀 신경쓰면 될 것 같다.