안녕하세요. 이번에는 백준 11866 요세푸스 문제 0 문제를 풀어보려고 합니다.
https://www.acmicpc.net/problem/11866
Problem
요세푸스 문제는 다음과 같다.
1번부터 N번까지 N명의 사람이 원을 이루면서 앉아있고, 양의 정수 K(≤ N)가 주어진다. 이제 순서대로 K번째 사람을 제거한다. 한 사람이 제거되면 남은 사람들로 이루어진 원을 따라 이 과정을 계속해 나간다. 이 과정은 N명의 사람이 모두 제거될 때까지 계속된다. 원에서 사람들이 제거되는 순서를 (N, K)-요세푸스 순열이라고 한다. 예를 들어 (7, 3)-요세푸스 순열은 <3, 6, 2, 7, 5, 1, 4>이다.
N과 K가 주어지면 (N, K)-요세푸스 순열을 구하는 프로그램을 작성하시오.
Solution
import java.io.*;
import java.util.*;
public class Main {
static StringBuilder sb = new StringBuilder();
static Queue<Integer> queue;
public static void main(String[] args) throws IOException {
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());
queue = new LinkedList<>();
for(int i = 1; i <= N; i++) {
queue.offer(i);
}
int count = 0;
sb.append("<");
while(!queue.isEmpty()) {
check(K);
}
System.out.println(sb.toString());
}
public static void check(int k) {
int num = queue.poll();
for(int i = 1; i < k; i++) {
queue.offer(num);
num = queue.poll();
}
if(!queue.isEmpty()) {
sb.append(num).append(", ");
} else {
sb.append(num).append(">");
}
}
}
이번 문제는 주어진 K 번째마다 사람을 제거하기 위해서는 선입선출을 가진 Queue를 사용해서 문제를 접근하면 된다. K 번이 되기 전까지는 queue에 다시 추가하고 K번이면 poll을 하면서 최종적으로 queue가 빌때까지 반복하면 쉽게 해결할 수 있는 문제이다.
핵심 코드
public static void check(int k) {
int num = queue.poll();
for(int i = 1; i < k; i++) {
queue.offer(num);
num = queue.poll();
}
if(!queue.isEmpty()) {
sb.append(num).append(", ");
} else {
sb.append(num).append(">");
}
}
Performance
반응형
'백준 Algorithm > 백준 CLASS2' 카테고리의 다른 글
[백준] CLASS2 11650 좌표 정렬하기 - JAVA [자바] (2) | 2023.10.15 |
---|---|
[백준] CLASS2 11050 이항 계수 1 - JAVA [자바] (2) | 2023.10.14 |
[백준] CLASS2 10866 덱 - JAVA [자바] (0) | 2023.10.13 |
[백준] CLASS2 10845 큐 - JAVA [자바] (0) | 2023.10.12 |
[백준] CLASS2 10828 스택 - JAVA [자바] (0) | 2023.10.11 |