[백준] 요세푸스 문제

김현진·2022년 1월 19일
0

코테준비

목록 보기
19/22
  • 문제 해결 :
    요세푸스 문제는 다음과 같다.

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

    예를 들면, <1,2,3,4,5,6,7>의 7명이 앉아있을 때 3번째 사람을 계속 제거한다면
    3, 6, 2, 7, 5, 1, 4 순서대로 사람들이 제거되게 된다.
    나는 이 문제에서 원을 그리며 앉아있는 것이 핵심이라고 생각하였다.
    원을 그리며 앉아있으므로 <1,2,3,4,5,6,7>과 <2,3,4,5,6,7,1>은 같은 것이기
    때문에 3번째 사람이 아닌 경우는 첫 번째 자리에서 제거시키고 맨 뒤에 붙이면 되고,
    3번째 사람이라면 첫 번째 자리에서 제외시카고 맨 뒤에 붙이지만 않으면 되는 것이다.
    즉, <-out <1,2,3,4,5,6,7> <-in 의 규칙대로 하면 된다.
    따라서 이 구조는 Queue의 구조와 같기 때문에 Queue로 구현하였다.
public class Q1158 {
    public static void main(String[] args) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();

        String [] input = br.readLine().split(" ");


        int N = Integer.parseInt(input[0]);

        int K = Integer.parseInt(input[1]);

        Queue<Integer> queue = new LinkedList<>();

        sb.append("<");

        for (int i = 1; i <= N; i++) {
            queue.add(i); //queue에 순서대로 삽입
        }

        int count = 0;

        while (!queue.isEmpty()) {
            count++; 
            if (count % K == 0) { //count가 k의 배수 일 경우는 삭제
                if (queue.size() == 1) { 
                	sb.append(queue.remove() + ">");
                }
                else {
                    sb.append(queue.remove() + ", ");
                }
            } else { //count가 k의 배수가 아닐 경우는 앞에서 제거 후 뒤에서 이어 붙임
                queue.add(queue.remove());
            }
        }
        System.out.println(sb);
    }
}

0개의 댓글

관련 채용 정보

Powered by GraphCDN, the GraphQL CDN