Problem_Solving

백준(BOJ) 11866 : 요세푸스 문제 0 (실버5) / 자바(Java) 풀이

CONCAT 2024. 5. 15. 18:10
728x90

문제

https://www.acmicpc.net/problem/11866

3줄 요약

  1. 입력받은 N과 K를 이용해 1부터 N까지의 숫자를 Queue에 추가하여 초기화합니다.
  2. Queue가 비어있지 않을 때까지 반복하면서, K-1번 회전하여 K번째 사람을 제거하고 출력합니다. 제거된 사람은 출력 형식에 맞춰 쉼표(,)로 구분하고, 마지막 사람은 닫는 괄호(>)로 마무리합니다.
    • K번째가 아닌 경우에는 맨 앞의 사람을 Queue의 맨 뒤로 보내는 회전 작업을 수행합니다.
  3. 최종적으로 요세푸스 순열을 구현하기 위해 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();
	}
}