728x90
1. 문제
https://www.acmicpc.net/problem/2840
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 |
댓글