문제 풀이/Baekjoon Online Judge
[Baekjoon Online Judge] 1934번: 요세푸스 문제
hyeonic
2021. 3. 4. 11:16
1158번: 요세푸스 문제
첫째 줄에 N과 K가 빈 칸을 사이에 두고 순서대로 주어진다. (1 ≤ K ≤ N ≤ 5,000)
www.acmicpc.net
요구사항
- 1번부터 N번까지 N명의 사람이 원을 이루면서 앉아있고, 양의 정수 K(≤ N)가 주어진다. 이제 순서대로 K번째 사람을 제거한다.
- 한 사람이 제거되면 남은 사람들로 이루어진 원을 따라 이 과정을 계속해 나간다.
- 이 과정은 N명의 사람이 모두 제거될 때까지 계속된다. 원에서 사람들이 제거되는 순서를 (N, K)-요세푸스 순열이라고 한다.
입력
- 첫째 줄에 N과 K가 빈 칸을 사이에 두고 순서대로 주어진다. (1 ≤ K ≤ N ≤ 5,000)
출력
- 예제와 같이 요세푸스 순열을 출력한다.
Queue를 활용하여 해결한다. 만약 3번째 사람을 제거한다고 가정한다.
1, 2, 3, 4, 5, 6, 7 로 총 7명의 사람이 원을 이루고 있다고 가정한다.
1, 2 는 1번째, 2번째 사람이기 때문에 제거하지 않는다. 단순히 뒤로 밀린다.
3, 4, 5, 6, 7, 1, 2 로 3이 제거된다.
4, 5, 6, 7, 1, 2 로 4와 5는 1번째, 2번째 이기 때문에 뒤로 밀린다.
6, 7, 1, 2, 4, 5 으로 3번째인 6이 제거된다.
이러한 과정을 반복한다. 즉 원을 그린사람들을 하나의 Queue로 가정하고 3번째 순서인 사람만 poll 하고, 아닌 사람들은 Quque에 다시 offer를 진행한다.
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.LinkedList;
import java.util.Queue;
public class Baekjoon1158 {
public static void main(String[] args) throws IOException {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(System.out));
String[] input = bufferedReader.readLine().split(" ");
int n = Integer.parseInt(input[0]);
int k = Integer.parseInt(input[1]);
Queue<Integer> queue = new LinkedList<>();
for (int i = 1; i <= n; i++) queue.offer(i);
StringBuilder stringBuilder = new StringBuilder("<");
while (!queue.isEmpty()) {
if (queue.size() == 1) {
stringBuilder.append(queue.poll() + ">");
break;
}
for (int i = 0; i < k - 1; i++) // k까지 제거한 후 queue의 뒤에 채운다.
queue.offer(queue.poll());
stringBuilder.append(queue.poll() + ", ");
}
bufferedWriter.write(stringBuilder.toString());
bufferedWriter.flush();
bufferedReader.close();
bufferedWriter.close();
}
}