본문 바로가기
JAVA

[JAVA][백준] 11866_요세푸스 문제 0 (Queue)

by saemsaem 2024. 5. 1.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine()); // 한 줄에서 숫자 2개를 분리하기 위한 tokenizer
        StringBuilder sb = new StringBuilder(); // 결과 출력을 위한 string builder
        sb.append("<");

        int n = Integer.parseInt(st.nextToken()); // n명의 사람
        int k = Integer.parseInt(st.nextToken()); // k번째를 제거

        /* Queue 선언 */
        Queue<Integer> queue = new LinkedList<>();

        /* queue에 1~n 값 넣기 */
        for (int i = 1; i <= n; i++) {
            queue.add(i);
        }

        /* k번째 값이 될 때까지 값을 뺐다가 맨 뒤에 다시 넣고, k번째에는 값을 poll해서 sb에 저장 */
        while (queue.size() > 1) {
            for (int i = 1; i < k; i++) {
                int temp = queue.poll();
                queue.add(temp);
            }
            sb.append(queue.poll()).append(", ");
        }
        sb.append(queue.poll());
        sb.append(">");

        System.out.println(sb);
    }
}


이 문제는 Queue를 사용해서 해결할 수 있다. 

k번째 숫자가 나올 때까지 맨 앞의 값을 빼서 맨 뒤로 넣는다. 
k번째 숫자가 나왔을 때 그 값을 poll해서 저장한다. 

이런 식으로 반복하다 보면 모든 값을 꺼낼 수 있게 된다. 

추가적으로 출력 서식에 맞추기 위해 마지막 값은 while문이 끝난 뒤에 poll한 뒤 저장했다. 


BufferedReader를 사용할 때, 한 줄에서 두 개 이상의 값을 받아야 한다면 StringTokenizer을 사용해야 한다는 것을 잊지 말자 !!!