[BOJ Baekjun]-ジョセフ問題011866 Java



📌 問題の説明


n人が順番に座っている.△誰もが番号札を持っています.
k番目の人を選んで、彼が持っている番号表を印刷します.
すべての人を選ぶまで繰り返す.
Queueで解いた
  • k-1、キューから抜いて後ろに入れます.
    poll() -> offer()
  • k人を選択します.
  • Queueのサイズが1になるまで、以上の2つの手順を繰り返します.
  • Queueのサイズが1の場合、繰り返しを終了し、Queueに残っている人を出力して終了する.
  • K番目の個人を見つければ出力できるのですが、出力フォーマットがおかしいので出力フォーマットに注意.
    package com.example.boj;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.util.StringTokenizer;
    
    import java.util.*;
    
    public class Q11866 {
    
        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> queue = new LinkedList<>();
    
            for (int i=1;i<=n;i++) {
                queue.add(i);
            }
    
            StringBuilder sb = new StringBuilder("<");
            while (queue.size() > 1) {
                // k-1번 앞에서 뽑아서 뒤로 넣는 작업 반복 (poll -> offer)
                for(int i=0;i<k-1;i++) {
                    int tmp = queue.poll();
                    queue.offer(tmp);
                }
                // k번째 사람 출력 (StringBuilder에 추가)
                sb.append(queue.poll() + ", ");
            }
    
    	// 큐에 남은 마지막사람을 출력
            sb.append(queue.poll());
            sb.append(">");
    
            System.out.println(sb.toString());
        }
    }