Study for Backend/Programming language - Java

[Java 연습] Queue를 이용한 요세프스 순열 문제

지미니박 2024. 2. 22. 22:51

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;
import java.util.stream.IntStream;

//20240222
/*
요세프스 순열 문제
N과 K가 주어졌을 때 (N,K) 요세프스 순열을 구하시오.
N과 K는 N >= K를 만족하는 양의 정수이다.
1부터 N번 까지 N명이 순서대로 원을 이루어 모여있다.
이 모임에서 원을 따라 순서대로 K번째 사람을 제외한다.
모든 사람이 제외될 때까지 반복하며 이 때, 제외되는 순서가 요세푸스 순열이다.
*/
public class queuePractice03 {
    public static ArrayList getJosephusPermutation(int N, int K){
        Queue queue = new LinkedList();
        ArrayList result = new ArrayList();

        IntStream.range(1, N + 1).forEach(x -> queue.add(x));

        int cnt = 0;
        while (!queue.isEmpty()){
            int data = (int)queue.remove();
            cnt += 1;

            if(cnt % K == 0){
                result.add(data);
            }else {
                queue.add(data);
            }
        }

        return result;
    }

    public static void main(String[] args){
        System.out.println(getJosephusPermutation(5, 2));
        System.out.println(getJosephusPermutation(7, 3));

    }
}