문제 링크 : https://www.acmicpc.net/problem/2840
이 문제는 문제의 조건을 구현하는 구현 문제입니다. 문제에서는 원판이 돌아가고 바늘이 고정되어 있는데 배열에서 이를 편하게 사용하기 위해 바늘을 움직이고 원판을 고정하는 방식으로 진행하면 됩니다. 즉 문제에서 화살표가 가리키는 글자가 몇 번 바뀌었는지는 다시 말하면 바늘이 얼마나 움직였는지를 의미하고, 그 글자는 움직인 위치의 글자가 됩니다.
여기서 주의할 점은 !를 출력하는 경우의 수 입니다. 크게 다음과 같습니다.
여기서 1번째는 쉽게 추론할 수 있지만 2번째의 경우 쉽게 알아채기 힘듭니다. 보통 1번에 포함된다고 생각하기 쉬운데요, 2번의 경우도 가능하니 꼭 관련 처리를 해주셔야 합니다.
다음은 코드입니다.
import java.util.*;
import java.io.*;
class Main{
public static void main(String[] args) throws Exception{
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[] wheel = new String[N];
Arrays.fill(wheel,"?");
boolean[] check = new boolean[26];
int idx = 0;
for(int i=0;i<K;i++){
st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
String s = st.nextToken();
idx += (n%N);
if(idx >= N) idx -= N;
if(!wheel[idx].equals(s) && !wheel[idx].equals("?")){
System.out.println("!");
return;
}
int ascii = s.charAt(0)-'A';
if(check[ascii] && !wheel[idx].equals(s)){
System.out.println("!");
return;
}
wheel[idx] = s;
check[ascii] = true;
}
int cnt = N;
while(cnt-- >0){
System.out.print(wheel[idx]);
idx--;
if(idx<0) idx=N-1;
}
}
}