suheang

[백준] | JAVA, 자바 | 1158번 - 요세푸스 문제 본문

알고리즘

[백준] | JAVA, 자바 | 1158번 - 요세푸스 문제

suheang 2024. 9. 26. 20:38

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


문제 요약 :

1번부터 N번까지 N명의 사람이 원을 이루면서 앉아있고, 양의 정수 K(≤ N)가 주어진다. 이제 순서대로 K번째 사람을 제거한다. 한 사람이 제거되면 남은 사람들로 이루어진 원을 따라 이 과정을 계속해 나간다. 이 과정은 N명의 사람이 모두 제거될 때까지 계속된다. 원에서 사람들이 제거되는 순서를 (N, K)-요세푸스 순열이라고 한다.

 

N과 K가 주어지면 (N, K)-요세푸스 순열을 구하는 프로그램을 작성


문제 풀이 :

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
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());

        int n = Integer.parseInt(st.nextToken());
        int k = Integer.parseInt(st.nextToken());

        Queue<Integer> circle = new LinkedList<>();
        ArrayList<Integer> result = new ArrayList<>();

        for (int i = 1; i <= n; i++) {
            circle.add(i);
        }

        int cnt = 0;
        while (!circle.isEmpty()) {
            int num = circle.poll();
            cnt++;
            if (cnt == k) {
                result.add(num);
                cnt = 0;
            } else {
                circle.add(num);
            }
        }
        System.out.print("<");
        for (int i = 0; i < result.size(); i++) {
            if (i == result.size() - 1) {
                System.out.print(result.get(i) + ">");
            } else {
                System.out.print(result.get(i) + ", ");
            }
        }
    }
}

 

1. n과 k 입력받기
2. 큐 circle 생성, 요세푸스 수열을 저장할 ArrayList result 생성
3. 큐에 1부터 n 번까지 숫자 입력
4. k 번째 위치를 확인하기 위한 변수 cnt 생성
5. circle이 비어있지 않다면 while 문 동작

5 - 1. 변수 num을 만들고 circle에서 값을 빼옴

5 - 2. cnt++, 만약 cnt의 값이 k라면 result에 num의 값을 추가하고 cnt를 0으로 초기화

5 - 3. 그렇지 않다면 num을 다시 circle에 추가

6. result에 있는 값들을 출력 형식에 맞춰 출력