본문 바로가기
코딩테스트 준비/백준

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

by mwzz6 2024. 12. 12.

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

 

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


1.  아이디어

 

큐 자료구조를 활용하면 원순열에서 특정 순서의 사람을 간단하게 제거할 수 있다.


2. 문제풀이

 

enqueue 값에 dequeue값을 넣으면 계속 순열을 원형으로 돌 수 있는 점을 활용했다.

모든 사람이 제거될 때까지 제거할 순번이 아닌 사람은 큐의 뒤에 넣고 제거할 사람은 따로 빼는 과정을 반복하면 로직을 구성할 수 있고 출력 양식을 맞추기 위해 StringBuilder를 활용했다.


3. 코드

 

import java.io.*;
import java.util.*;

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));
        StringBuilder sb = new StringBuilder();
        StringTokenizer st = new StringTokenizer(br.readLine());

        int N = Integer.parseInt(st.nextToken());
        int K = Integer.parseInt(st.nextToken());

        Queue<Integer> q = new ArrayDeque<>();
        for (int i = 1; i <= N; i++) {
            q.offer(i);
        }

        sb.append("<");
        while (!q.isEmpty()) {
            for (int i = 1; i < K; i++) {
                q.offer(q.poll());
            }

            sb.append(q.poll());
            if (!q.isEmpty()) sb.append(", ");
        }
        sb.append(">");

        bw.write(sb.toString());
        bw.flush();
    }
}

4. 후기