728x90
문제
https://www.acmicpc.net/problem/11866
3줄 요약
- 입력받은 N과 K를 이용해 1부터 N까지의 숫자를 Queue에 추가하여 초기화합니다.
- Queue가 비어있지 않을 때까지 반복하면서, K-1번 회전하여 K번째 사람을 제거하고 출력합니다. 제거된 사람은 출력 형식에 맞춰 쉼표(,)로 구분하고, 마지막 사람은 닫는 괄호(>)로 마무리합니다.
- K번째가 아닌 경우에는 맨 앞의 사람을 Queue의 맨 뒤로 보내는 회전 작업을 수행합니다.
- 최종적으로 요세푸스 순열을 구현하기 위해 Queue를 활용하여 사람들을 회전시키고, K번째 사람을 제거하는 과정을 반복하여 결과를 출력합니다.
코드
// package boj11866;
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws Exception {
// 입력을 파일에서 받기 위해 설정
// System.setIn(new FileInputStream("src/input.txt"));
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
// 입력값을 읽어서 N과 K로 분리
String[] tmp = br.readLine().split(" ");
int N = Integer.parseInt(tmp[0]);
int K = Integer.parseInt(tmp[1]);
// Queue 생성 및 1부터 N까지의 숫자를 추가
Queue<Integer> queue = new LinkedList<>();
for (int i = 1; i <= N; i++) {
queue.add(i);
}
// 결과 출력 형식을 맞추기 위해 <로 시작
bw.write("<");
// Queue가 비어있지 않을 때까지 반복
while (!queue.isEmpty()) {
// K번째 사람을 제거하기 위해 K-1번 회전
for (int i = 1; i <= K; i++) {
if (i == K) {
// K번째 사람을 제거하고 출력
bw.write(queue.poll() + "");
// Queue가 비어있다면 >로 마무리, 아니면 ,로 구분
if (queue.isEmpty()) {
bw.write(">");
} else {
bw.write(", ");
}
} else {
// K번째가 아니라면 맨 앞의 사람을 뒤로 보냄
queue.add(queue.poll());
}
}
}
// 출력 버퍼를 비움
bw.flush();
// 자원 해제
br.close();
bw.close();
}
}
'Problem_Solving' 카테고리의 다른 글
백준(BOJ) 1417 : 국회의원 선거 (실버5) / 자바(Java) 풀이 (0) | 2024.05.16 |
---|---|
백준(BOJ) 13335 : 트럭 (실버1) / 자바(Java) 풀이 (0) | 2024.05.16 |
백준(BOJ) 1874 : 스택 수열 (실버2) / 자바(Java) 풀이 (0) | 2024.05.14 |
백준(BOJ) 10773 : 제로 (실버4) / 자바(Java) 풀이 (0) | 2024.05.14 |
백준(BOJ) 4949 : 균형잡힌 세상 (실버4) / 자바(Java) 풀이 (0) | 2024.05.14 |