Baekjoon

[백준] 1158번 요세푸스 문제 (Java)

Chaewon Park 2024. 3. 6. 17:01

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

 

1158번: 요세푸스 문제

첫째 줄에 N과 K가 빈 칸을 사이에 두고 순서대로 주어진다. (1 ≤ K ≤ N ≤ 5,000)

www.acmicpc.net


문제


알고리즘

 

이 문제는 Queue를 사용해서 문제를 해결하면 쉽다!

 

1. 1~N까지의 정수를 Queue에 add 해준다.

2. K-1번을 poll해서 다시 Queue에 add해준다.

3. 그러면 Queue의 맨 앞의 숫자를 poll 해서 삭제한다.

4. 1~3번을 Queue의 size가 1일 때까지 반복한다.

5. 마지막 Queue의 숫자를 빼서 해결 !

 


코드
import java.util.*;
import java.io.*;

public class Main {
    public static void main(String [] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        Queue<Integer> que = new LinkedList<>();

        StringTokenizer st = new StringTokenizer(br.readLine(), " ");
        int N = Integer.parseInt(st.nextToken());
        int K = Integer.parseInt(st.nextToken());

        for(int i=1; i<=N; i++) {
            que.offer(i);
        }

        int cnt = 1;
        bw.write("<");
        while(que.size() != 1) {
            if(cnt == K) {
                bw.write(que.peek() + ", ");
                que.poll();
                cnt = 1;
            }
            else {
                que.offer(que.poll());
                cnt++;
            }
        }

        bw.write(que.poll() + ">");
        
        bw.flush();
        br.close();
        bw.close();
    }
}