- 문제 해결 :
요세푸스 문제는 다음과 같다.
1번부터 N번까지 N명의 사람이 원을 이루면서 앉아있고, 양의 정수 K(≤ N)가 주어진다. 이제 순서대로 K번째 사람을 제거한다. 한 사람이 제거되면 남은 사람들로 이루어진 원을 따라 이 과정을 계속해 나간다. 이 과정은 N명의 사람이 모두 제거될 때까지 계속된다. 원에서 사람들이 제거되는 순서를 (N, K)-요세푸스 순열이라고 한다.
예를 들면, <1,2,3,4,5,6,7>의 7명이 앉아있을 때 3번째 사람을 계속 제거한다면
3, 6, 2, 7, 5, 1, 4 순서대로 사람들이 제거되게 된다.
나는 이 문제에서 원을 그리며 앉아있는 것이 핵심이라고 생각하였다.
원을 그리며 앉아있으므로 <1,2,3,4,5,6,7>과 <2,3,4,5,6,7,1>은 같은 것이기
때문에 3번째 사람이 아닌 경우는 첫 번째 자리에서 제거시키고 맨 뒤에 붙이면 되고,
3번째 사람이라면 첫 번째 자리에서 제외시카고 맨 뒤에 붙이지만 않으면 되는 것이다.
즉, <-out <1,2,3,4,5,6,7> <-in 의 규칙대로 하면 된다.
따라서 이 구조는 Queue의 구조와 같기 때문에 Queue로 구현하였다.
public class Q1158 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
String [] input = br.readLine().split(" ");
int N = Integer.parseInt(input[0]);
int K = Integer.parseInt(input[1]);
Queue<Integer> queue = new LinkedList<>();
sb.append("<");
for (int i = 1; i <= N; i++) {
queue.add(i);
}
int count = 0;
while (!queue.isEmpty()) {
count++;
if (count % K == 0) {
if (queue.size() == 1) {
sb.append(queue.remove() + ">");
}
else {
sb.append(queue.remove() + ", ");
}
} else {
queue.add(queue.remove());
}
}
System.out.println(sb);
}
}