[Java] 백준(Baekjoon) 1158. 요세푸스 문제

2024. 1. 24. 17:56Algorithm/자료구조

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

 

1158번: 요세푸스 문제

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

www.acmicpc.net

 

 

 


 

풀이

 

인덱스 지정하여 삭제 후, 인덱스 재조정 필요 

=> ArrayList

 

 

1 2 3 4 5 6 7 //3(idx=2) 

1 2 4 5 6 7 //6(idx=4) idx(4)+= idx(2)+(k(3)-1)

1 2 4 5 7  //2(idx=1)

idx+=idx+(k-1)을 하면 4+2= 6

 -> 1로 만들려면 현재 배열의 사이즈로 나눈 나머지로 인덱스를 변경

 

package dataStructure;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;

public class Ex1158 {

	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub

		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		String s= br.readLine();
		StringTokenizer st= new StringTokenizer(s);
		
		int n= Integer.parseInt(st.nextToken());
		int k= Integer.parseInt(st.nextToken());
		
		List<Integer> arr= new ArrayList<Integer>();
		//리스트 생성
		for(int i=1;i<n+1;i++) {
			arr.add(i);
		}
		
		StringBuilder sb = new StringBuilder();
		sb.append("<");
		
		int idx= k-1;
		boolean on= false;
		while(!arr.isEmpty()) {
			if(on) {
				sb.append(", ");
			}
			sb.append(arr.get(idx));
			arr.remove(idx);
			
			if(!arr.isEmpty()) {
				idx= (idx+(k-1))%(arr.size());
			}
			
			on= true;
		}
		
		sb.append(">");
		
		System.out.println(sb.toString());
	}

}