• Home
  • About
    • 정윤수 (Jeong Yun Soo) photo

      정윤수 (Jeong Yun Soo)

      #Node.js #Server #BlockChain #Ethereum

    • Learn More
    • Email
    • Facebook
    • Github
  • Posts
    • All Posts
    • All Tags
  • Projects

[백준 알고리즘] 요세푸스 문제 0

29 Jan 2020

Reading time ~1 minute

요세푸스 문제 0

문제 설명

요세푸스 문제는 다음과 같다.

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

N과 K가 주어지면 (N, K)-요세푸스 순열을 구하는 프로그램을 작성하시오.

제한 사항

입출력 예

첫째 줄에 N과 K가 빈 칸을 사이에 두고 순서대로 주어진다. (1 ≤ K ≤ N ≤ 1,000)
예제와 같이 요세푸스 순열을 출력한다. 입력
7 3

출력
<3, 6, 2, 7, 5, 1, 4>

입출력 예 설명

풀이

  1. 하나의 큐를 만들어 모든 문자를 넣어준 뒤 K만큼의 순번이 아닌 숫자를 큐에서 빼고 다시 넣어준다. K만큼의 순번인 숫자는 Answer 변수에 넣어준다.

푸는 과정에서의 오류

배운점

이번에 쿠팡 코딩테스트에서 DFS 탐색과 큐쪽에서 많이 부족하다고 생각했습니다. 다시 큐 문제를 풀어봄으로써, 어떻게 활용하는지 다시 배운 문제입니다.

소스코드

import java.util.*;

class Main {
    public static void main(String[] args) {
        Queue<Integer> q = new LinkedList<>();
        ArrayList<Integer> arr = new ArrayList<>();
        Scanner sc = new Scanner(System.in);
        int count=1;
        int num = sc.nextInt();
        int trum = sc.nextInt();
        int[] answer = new int[num];
        for(int i=1;i<=num;i++) {
            q.offer(i);
        }
        while(!q.isEmpty()) {
            if(count % trum == 0) {
                count=0;
                arr.add(q.poll());
            } else {
                q.offer(q.poll());
            }
            count++;
        }
        System.out.print("<");
        for(int i=0;i<arr.size()-1;i++) {
            System.out.print(arr.get(i) + ", ");
        }
        System.out.print(arr.get(arr.size()-1) + ">");
    }
}


coding test Share Tweet +1