요세푸스 문제

구해야 하는 것

  • 주어진 N과 K로 요세푸스 순열

주어진 자료

  • 사람은 1번부터 N명까지 원을 이루어 앉아있음
  • 사람이 모두 제거될 때까지 순서대로 K번째 사람을 제거
  • 요세푸스 순열 = 제거되는 순서

조건

  • 1 <= K <= N <= 5,000

계획

  1. 1 ~ N까지 큐에 넣는다.
  2. 큐의 첫 번째 값을 꺼낸 후 다시 맨 뒤로 넣는다.(원을 이루어 앉아있기 때문)
  3. K번째 값을 만나면 삭제한다.
  4. 큐의 크기가 0이 될 때까지 반복한다.

실행

public class Main {
    // 큐에 N번까지의 사람 넣기
    public void addPeople(Queue<Integer> q, int n) {
        for(int i = 1; i <= n; i++) {
            q.add(i);
        }
    }

    // 요세푸스 순열 만들기
    public void makeJosephus(Queue<Integer> q, int k, ArrayList<Integer> josephus) {
        int cnt = 1; // 몇 번째 사람인지

        while(q.size() > 0) {
            int cur = q.peek(); // 첫 번째 값

            if(cnt == k) { // k번째 사람 제거
                josephus.add(cur); // 요세푸스 순열에 넣어주고
                q.remove(); // 제거
                cnt = 1;
            }
            else {
                q.remove(); // 첫 번째 값 제거하고
                q.add(cur); // 맨 뒤에 다시 넣어줌
                cnt++;
            }
        }
    }
    
    public void print(ArrayList<Integer> josephus) {
        System.out.print("<");
        for(int i = 0; i < josephus.size(); i++) {
            System.out.print(josephus.get(i));

            if(i != josephus.size() - 1) {
                System.out.print(", ");
            }
        }
        System.out.println(">");
    }
    
    public void solution(int n, int k) {
        // 1. 1 ~ N까지 큐에 넣는다.
        Queue<Integer> q = new LinkedList<>();
        addPeople(q, n);
        
        // 2. 요세푸스 순열을 만든다.
        ArrayList<Integer> josephus = new ArrayList<>();
        makeJosephus(q, k, josephus);
        
        // 3. 요세푸스 순열을 출력한다.
        print(josephus);
    }
    
    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());
        
        new Main().solution(n, k);
    }
}