• Feed
  • Explore
  • Ranking
/
/
    맞았습니다!!

    BOJ : 백준 1158 요세푸스 문제(JAVA)

    백준 1158 요세푸스 문제 자바 풀이 💡
    알고리즘자료구조
    t
    t1s
    2025.04.26
    ·
    3 min read

    문제

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

    입력
    N K

    풀이

    수학적인 규칙을 찾아보려(나눠서 나머지가 나오고 어쩌고...) 애 썼는데...
    N<K인 동안, 원형 큐라고 생각하고 돌게 하면 되지 않나?

    Queue를 먼저 선언한다.
    FIFO 특성을 이용해서, k-1번만큼 q.poll()한 것을 add 해서 집어넣는다.
    마지막 k번째 poll() 한 것을 결과값으로 출력할 result에 집어넣는다.
    이후 Queue가 비면, result를 출력한다.

    import java.io.*;
    import java.util.*;
    
    public class Main {
    	
    	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());
    		
    		int i = 0;
    		ArrayList<Integer> result = new ArrayList<>();
    		
    		Queue<Integer> q = new LinkedList<>();
    		for(i=0; i<N; i++) {
    			q.add(i);
    		}
    		
    		while(!q.isEmpty()) {
    			for(int j=0; j<K-1; j++) {
    				q.add(q.poll());
    			}
    			result.add(q.poll() + 1);
    			i++;
    		}
    		
    		System.out.print("<");
    		for(i=0; i<N-1; i++) {
    			System.out.print(result.get(i) + ", ");
    		}
    		System.out.print(result.get(N-1));
    		System.out.print(">");
    	}
    
    }

    통과~

    생각해보면 result도 따로 선언할 필요 없는 거 같다!


    문제를 풀며

    나에게 적당히 어려운 문제를 찾는 게 어려운 것 같다







    - 컬렉션 아티클