
요세푸스 순열 문제의 응용 버전이다. (백준 11866번)
원형 Queue에서 시계방향, 반시계방향 두 방향을 커버할 수 있는 상황을 고려해야한다.
풍선의 순서와 그 안에 적혀있는 종이의 정수를 같이 기록해야 하므로 배열을 할당한다.
Deque<int[]> q = new ArrayDeque<>();
for(int i=0; i<N; i++){
q.add(new int[]{i, num});
}
이런 방식의 코드를 사용하면 Queue를 만들고, 그 안을 배열 방식으로 할당할 수 있다.
위 정보를 바탕으로 설계한 코드는 다음과 같다.
import java.util.*;
import java.io.*;
class Main{
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st;
int N = Integer.parseInt(br.readLine());
st = new StringTokenizer(br.readLine(), " ");
Deque<int[]> q = new ArrayDeque<>();
for(int i=1; i<=N; i++){
int num = Integer.parseInt(st.nextToken());
q.add(new int[]{i, num});
}
int[] balloon = q.pollFirst();
bw.write(balloon[0] + " ");
int move = balloon[1];
while(!q.isEmpty(){
if(move > 0){
for(int i=0; i<move-1; i++){
q.addLast(q.pollFirst());
}
balloon = q.pollFirst();
}else{
move = -move;
for(int i=move-1; i>0; i--){
q.addFirst(q.pollLast());
}
balloon = q.pollLast();
}
bw.write(balloon[0] + " ");
move = balloon[1];
}
bw.flush();
bw.close();
}
}
맞았습니다!!