본문 바로가기
Coding test/Baekjoon

[백준][JAVA] 1158번: 요세푸스 문제

by jepa 2023. 8. 12.
728x90
SMALL

https://www.acmicpc.net/problem/1158

 

1158번: 요세푸스 문제

첫째 줄에 N과 K가 빈 칸을 사이에 두고 순서대로 주어진다. (1 ≤ K ≤ N ≤ 5,000)

www.acmicpc.net

해당 문제는 원 순열로 Queue구조를 이용하면 간단하게 구현할 수 있다.

 

LinkedList가 Queue를 구현하기 때문에 LinkedList를 이용했다.

 

코드는 먼저 N명의 사람을 순차적으로 LinkedList에 담은 후

K-1번 앞의 사람을 뒤로 보내주고 다음의 K번째를 제거해준다.

 

해당 과정을 반복하며 queue가 빈 값이 될 때까지 진행 시켜주면 된다.

import java.util.*;
import java.io.*;
public class Main {
    public static void main(String[] args) throws Exception{
        Queue<Integer> queue = new LinkedList<>();
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

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

        int N = Integer.parseInt(str[0]);
        int K = Integer.parseInt(str[1]);

        for(int i=1 ; i<=N ; i++){
            queue.add(i);
        }
        if(!queue.isEmpty()){ //N은 1보다 크거나 같기 때문에 안해주어도 되긴한다.
            for(int i = 1 ; i< K ; i++){
                queue.add(queue.remove());
            }
        }
        StringBuilder sb = new StringBuilder("<").append(queue.remove());

        while(!queue.isEmpty()){
            for(int i = 1 ; i< K ; i++){
                queue.add(queue.remove()); // K-1번 앞의 사람을 뒤로 보내주고
            }
            sb.append(", ").append(queue.remove()); // K번째 제거
        }
        sb.append(">");
        System.out.println(sb);
    }
}

 

728x90
LIST