[JAVA/1158번] 요세푸스 문제

고지훈·2021년 9월 8일
1

Algorithm

목록 보기
19/68
post-thumbnail

문제


입력 및 출력


풀이

import java.io.*;
import java.util.*;

class Main {
    public static void main(String args[]) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String[] strs = br.readLine().split(" ");
        int N = Integer.parseInt(strs[0]);
        int K = Integer.parseInt(strs[1]);

        Queue < Integer > queue = new LinkedList();

        StringBuilder sb = new StringBuilder();
        sb.append("<");

        for (int i = 0; i < N; i++) {
            queue.offer(i + 1);
        }

        while (queue.size() > 1) {
            for (int i = 0; i < K - 1; i++) {
                int value = queue.poll();
                queue.offer(value);
            }
            sb.append(queue.poll()).append(", ");
        }
        sb.append(queue.poll()).append(">");
        System.out.println(sb);
    }
}

결과 및 해결방법

[결과]

[정리]

해결방법

  • 처음 문제 접근을 하였을 때 List로 구현하면 쉽게 문제를 해결할 수 있겠다고 생각하여 접근하였다.

    하지만 리스트의 사이즈가 2 이하일 경우 인덱스를 처리하면서 문제가 발생하였고, 그런 이유 때문에 Queue를 사용해서 구현하였다.

  • QueueInteger 타입으로 선언하고 offer 메소드를 사용하여 Queue에 1부터 N까지 값을 저장하였다.

    Queue의 사이즈가 1보다 크고, i가 0부터 K - 1번째까지 Queue에 값을 뽑아 value에 저장하고 그것을 다시 Queue에 추가하였다. 즉 [1, 2, 3, 4, 5, 6, 7]의 배열이 있고 K의 값이 3일 경우, [1, 2]의 값을 Queue에 추가하여 [3, 4, 5, 6, 7, 1, 2]의 형태로 만들고 StringBuilder에 K 번째 값을 추가하였다.

    while 반복문을 수행 후 Queue에는 하나의 값이 남아있는데, 마찬가지로 StringBuilder에 남아있는 데이터도 추가한다.

profile
"계획에 따르기보다 변화에 대응하기를"

0개의 댓글