곽로그

[백준 11866] 요세푸스 문제 0 본문

알고리즘/백준

[백준 11866] 요세푸스 문제 0

일도이동 2020. 1. 27. 20:23
반응형

문제

 

11866번: 요세푸스 문제 0

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

www.acmicpc.net

 

접근법

1. 수열에서 삭제한 숫자를 요세푸스 수열에 넣는다.

 * 이때 수열에서 삭제를 하게 될 때, 삭제 이후의 요소들이 자동으로 땡겨지게 하여야 하므로 ArrayList를 이용해 수열을 구현한다.

* 삭제할 숫자를 가르키는 pointer 변수를 만든다.

* 입력 받은 K는 그 다음 요세푸스 숫자를 가르키기 위한 숫자로 K=3이면 삭제한 숫자에서 3 떨어진 위치의 숫자가 요세푸스 숫자가 된다.

 

2. 수열에서 숫자를 삭제하게 되면 뒤에 있는 요소가 앞으로 땡겨지기 때문에 현재 pointer가 +1 이 된다. 따라서 그 다음 요세푸스 숫자를 가리키기 위해 pointer+(K-1)을 한다.

 

3. 이때 pointer가 숫자배열의 크기를 넘어가게 되는 경우가 생기는데 나머지 연산을 이용해서 유효한 포인터로 바꾼다. 

 

코드

 

package queue;

import java.io.BufferedWriter;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.Scanner;

public class Jo4 {
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		int N = in.nextInt();
		int K = in.nextInt();
		
		ArrayList<Integer> numArray = new ArrayList<Integer>();
		int[] joArray = new int[N];
		
		for(int i=1; i<=N; i++) {
			numArray.add(i);
		}
		
		int ptr=0;
		int index=0;
		StringBuilder sb = new StringBuilder();
		sb.append("<");
		
		for(int i=0; i<joArray.length;i++) {
			int max = numArray.size();
			ptr=index;
			ptr+=(K-1);
			
			index=ptr%max;
			
			joArray[i] = numArray.remove(index);
			sb.append(joArray[i]+", ");
		}
		
		sb.delete(sb.length()-2, sb.length());
		sb.append(">");
		System.out.println(sb);
		
		
		
		

	}
}

 

 

comment

이 문제가 왜 큐로 분류되어 있는지 모르겠다. 

반응형

'알고리즘 > 백준' 카테고리의 다른 글

[백준 2869] 달팽이는 올라가고 싶다  (0) 2020.02.02
[백준 1712] 손익분기점  (0) 2020.02.02
[백준 2164] 카드2  (0) 2020.01.20
[백준 10799] 쇠막대기  (0) 2020.01.19
[백준 1021] 회전하는 큐  (0) 2020.01.12
Comments