문제(출처: https://www.acmicpc.net/problem/9863)
< Calling All Programmers >
문제 풀이
Queue를 사용하여 m번째 값을 제거한다.
예를 들어 입력이 다음과 같다면
10 7 5
Queue에 <1, 2, 3, 4, 5, 6, 7, 8, 9, 10>이 들어간다.
1번째) <8, 9, 10, 1, 2, 3, 4, 5, 6> -> 7 제거
2번째) <5, 6, 8, 9, 10, 1, 2, 3> -> 4 제거
3번째) <3, 5, 6, 8, 9, 10, 1> -> 2 제거
4번째) <3, 5, 6, 8, 9, 10> -> 1 제거
5번째) <5, 6, 8, 9, 10> -> 3이 정답
my solution (Java)
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;
import java.util.StringTokenizer;
public class _9863_ { // Calling All Programmers
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(bf.readLine());
int n = 0;
while ((n = Integer.parseInt(st.nextToken())) != 0) {
int m = Integer.parseInt(st.nextToken());
int k = Integer.parseInt(st.nextToken());
Queue<Integer> queue = new LinkedList<>();
for (int i = 1; i <= n; i++) {
queue.add(i);
}
for (int i = 0; i < k; i++) {
for (int j = 0; j < m; j++) {
int num = queue.poll();
if (j == m - 1) {
if (i == k - 1) {
bw.write(num + "\n");
}
} else {
queue.add(num);
}
}
}
st = new StringTokenizer(bf.readLine());
}
bw.flush();
}
}
변수)
n, m, k : 사람 수, 건너뛰는 위치 수, k번째 호출자
queue : Queue <Integer>
num : 호출되는 사람 번호
n, m, k이 0이 아닐 때까지 입력받는다. Queue에 1부터 n까지 저장한다. k번째 호출자를 구하기 위해 다음 과정을 k번 반복한다.
1) 한 명씩 poll
2) m번째 사람이고 k번째 호출자라면 poll 한 값 출력
3) m번째 사람이 아니라면 제거되지 않으므로 Queue에 추가
'🌞Algorithm > 🔥Baekjoon' 카테고리의 다른 글
[Baekjoon] 7585_Brackets (1) | 2025.05.29 |
---|---|
[Baekjoon] 24570_Harp Tuning (1) | 2025.05.28 |
[Baekjoon] 26876_New Time (1) | 2025.05.26 |
[Baekjoon] 10689_Hamza (1) | 2025.05.23 |
[Baekjoon] 4679_The Snail (1) | 2025.05.22 |