코딩테스트/백준

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

블로그 주인장 2023. 8. 12.

[ 목차 ]


    📢 문제 출처

     

    1158번: 요세푸스 문제

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

    www.acmicpc.net


    📢 문제 설명


    📢 입출력 예시


    📢 그림 설명

     


    📢 풀이

    1. 1~N까지 Queue에 add한다.
    2. K - 1 번째까지는 첫 번째 값을 맨 뒤로 보낸다.
    3. K번째 일때는 poll해서 출력한다.
    4. Queue의 사이즈가 1개일 때까지 반복한다. (Queue의 요소가 1개면 어차피 그것만 빼서 출력하면 되기 때문이다)

    📢 코드

    import java.io.*;
    import java.util.LinkedList;
    import java.util.StringTokenizer;
    
    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));
    
            StringTokenizer st = new StringTokenizer(br.readLine());
            int N = Integer.parseInt(st.nextToken());
            int K = Integer.parseInt(st.nextToken());
    
            //리스트에 값 넣기
            LinkedList<Integer> list = new LinkedList<Integer>();
            for (int i = 1; i < N + 1; i++) {
                list.add(i);
            }
    
            bw.write('<');  //쓰기
            while(list.size() > 1){
                for (int i = 0; i < K - 1; i++) {
                    int num = list.poll();  //처음 값을 꺼낸다.
                    list.add(num);          //꺼낸 값을 뒤로 더해준다.
                }
                //뽑은 값 쓰기
                bw.write(list.poll() + ", ");
            }
    
            //마지막에 '>'로 닫아주고 쓰기
            bw.write(list.poll() + ">");
    
            bw.flush();
            bw.close();
        }
    }

    반응형

    댓글