본문 바로가기
Algorithm

백준 11866번 요세푸스 문제 0

by 2nyong 2023. 3. 9.

요세푸스 문제는 원으로 둘러 앉은 N명이 주어졌을 때, K번째 사람을 제거하는 문제다.

 

자료 구조 중 큐(Queue)를 사용해 풀이하였다.

 

다음과 같은 형태의 큐에서

[1, 2, 3, 4, 5, 6, 7]

 

가장 먼저 입력된 요소를꺼내 큐에 다시 넣어주는 과정(회전)을 무한히 반복한다면 

[1, 2, 3, 4, 5, 6, 7]
[2, 3, 4, 5, 6, 7, 1] <- 큐에서 1을 꺼내 다시 넣어준다.
[3, 4, 5, 6, 7, 1, 2] <- 큐에서 2를 꺼내 다시 넣어준다.
[4, 5, 6, 7, 1, 2, 3]               .
[5, 6, 7, 1, 2, 3, 4]               .
[6, 7, 1, 2, 3, 4, 5]               .
[7, 1, 2, 3, 4, 5, 6]               .
[1, 2, 3, 4, 5, 6, 7] <- 시작했던 큐의 형태로 돌아온다.

 

문제와 같이 N명이 원을 그리며 앉은듯한 형태를 만들 수 있다.

 

이제 큐(원)에 포함된 K번째 요소(사람)를 꺼내기 위해서는 큐를 K-1번 회전시켜야 한다.

for (int i = 0; i < k-1; i++) {
	int temp = queue.poll(); // 가장 앞의 요소를 꺼내고
	queue.offer(temp); // 큐에 다시 넣는다
}

num = queue.poll(); // K번째 요소가 첫번째로 이동했으므로 꺼낸다.

 

위 방식을 응용하여 작성한 코드는 다음과 같다.

import java.util.LinkedList;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {

        LinkedList<Integer> q = new LinkedList<>();

        Scanner in = new Scanner(System.in);
        StringBuilder sb = new StringBuilder();
        sb.append("<");

        int N = in.nextInt(); // 큐 사이즈
        int K = in.nextInt(); // 회전 수

        // 큐 생성
        for (int i = 1; i <= N; i++) {
            q.offer(i);
        }

        for (int n = 0; n < N; n++) {

            if (q.size() == 1) {
                sb.append(q.poll()).append(">");
                break;
            }

            for (int i = 0; i < K - 1; i++) {
                q.offerLast(q.pollFirst());
            }
            sb.append(q.pollFirst()).append(", ");
        }
        System.out.println(sb);
    }
}

'Algorithm' 카테고리의 다른 글

백준 1541번 잃어버린 괄호  (0) 2023.03.10
백준 11050번 이항계수 1  (0) 2023.03.10
백준 11047번 동전 0  (0) 2023.03.10
백준 1037번 약수  (2) 2023.03.09
백준 1927번 최소 힙  (0) 2023.03.09

댓글