알고리즘

백준 1158 요세푸스 문제

킨글 2024. 9. 7. 12:14

설명

1. queue를 이용해서 원으로 만들어준다. 

즉, 빼면 다시 넣어준다. 

2. idx가 K가 될 때에 list에 pollNum을 넣어주었다. 

3. 이외에는 다시 queue에 넣어주어 원으로 만들어주었다.

코드

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
import java.util.StringTokenizer;

public class Main {

    // 1158
    public static void main(String[] args) throws IOException {
        process();
    }

    private static void process() throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        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);
        }

        int idx = 1;
        List<Integer> list = new ArrayList<>();
        while(!queue.isEmpty()) {
            Integer pollNum = queue.poll();
            if(idx != 0 && idx % K == 0) {
                list.add(pollNum);
            } else {
                queue.add(pollNum);
            }
            idx++;
        }

        bw.write("<");
        for (int i = 0; i < list.size(); i++) {
            bw.write(list.get(i).toString());
            if(i != list.size() -1) {
                bw.write(", ");
            }
        }
        bw.write(">");

        bw.flush();
        bw.close();
        br.close();
    }

}