1158 - 요세푸스 문제
문제 풀이 시간 :
문제 요약
1번부터N번까지 사람이 원형으로 앉아 있음- 순서대로
K번째 사람을 제거 - 모든 사람이 제거될 때까지 반복
- 제거되는 순서를 출력하는 문제
문제 풀이
이 문제는 원형으로 순회하면서 K번째를 제거하는 과정을 그대로 구현하면 된다.
앞에서부터 사람을 꺼내고 제거할 차례가 아니면 다시 뒤로 보내는 방식으로 생각하면 큐로 쉽게 풀 수 있다.
매번 K-1명은 뒤로 보내고 K번째 사람은 제거해서 결과에 넣으면 된다.
이 과정을 큐가 빌 때까지 반복하면 문제에서 요구하는 요세푸스 순열을 그대로 구할 수 있다.
출력 형식이 <1, 2, 3>처럼 정해져 있으므로 StringBuilder로 문자열을 만들어 한 번에 출력하면 된다.
최종 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.Queue;
import java.util.StringTokenizer;
class Main {
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<Integer> q = new ArrayDeque<>();
// 1번부터 n번까지 큐에 삽입
for (int i = 1; i <= n; i++) {
q.add(i);
}
StringBuilder sb = new StringBuilder();
sb.append("<");
// 큐가 빌 때까지 K번째 사람 제거
for (int i = 0; i < n; i++) {
// 앞에서 K-1명은 뒤로 이동
for (int j = 0; j < k - 1; j++) {
q.add(q.poll());
}
// K번째 사람 제거
sb.append(q.poll());
// 마지막 원소가 아니면 쉼표 추가
if (i != n - 1) {
sb.append(", ");
}
}
sb.append(">");
System.out.println(sb);
}
}함께 읽으면 좋은 글
5430번 - AC
함수 R은 배열을 뒤집는 연산 함수 D는 첫 번째 원소를 버리는 연산 단, 배열이 비어 있을 때 D를 수행하면 error 주어진 함수 문자열을 순서대로 수행한 뒤 최종 배열을 출력하는 문제 처음에는 문제 설명 그대로 R이 나올 때마다 배열을 실제로 뒤집고, D가 나오면 맨 앞…
1966번 - 프린터 큐
여러 문서가 큐에 들어 있고, 각 문서마다 중요도가 있음 맨 앞 문서를 확인했을 때, 더 높은 중요도의 문서가 뒤에 하나라도 있으면 맨 뒤로 보냄 그렇지 않으면 바로 인쇄 특정 위치의 문서가 몇 번째로 인쇄되는지 구하는 문제 이 문제는 프린터의 동작을 그대로 구현하면 되는…
2164번 - 카드2
1부터 N까지 카드가 순서대로 쌓여 있음 맨 위 카드를 버리고, 그다음 맨 위 카드를 맨 아래로 옮기는 과정을 반복 마지막에 남는 카드 번호를 구하는 문제 이 문제는 규칙을 찾기보다, 문제에서 하라는 과정을 그대로 구현하면 된다. 카드 더미에서 반복되는 동작은 두 가지다.
17070번 - 파이프 옮기기 1
크기 N × N 격자에서 파이프를 이동시키는 경우의 수를 구하는 문제 파이프는 항상 2칸을 차지하며, 방향은 총 3가지 시작 상태는 (1,1) ~ (1,2) 가로 방향 파이프의 한쪽 끝이 (N, N) 에 도달하는 모든 경우의 수를 계산 처음 문제를 읽었을 때는 👉 그래프…