본문 바로가기
2024-?학기 ???/Solving

BOJ 1158_ 요세푸스 문제

by 껐다 켜보셨어요? 2024. 8. 29.

문제

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

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 ≤ 5,000)

출력

예제와 같이 요세푸스 순열을 출력한다.

예제 입력 1 

7 3

예제 출력 1 

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

 

import java.util.Arrays;
import java.util.Scanner;

public class BOJ_1158 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int N = sc.nextInt(), 
                    K = sc.nextInt(),
                    count  = 0, // K까지 세기를 반복하는 타이머
                    found  = 0; // newArr로 들어간 숫자의 수

		int[] arr = new int[N], 
		   newArr = new int[N];
		
		for(int i = 0; i<arr.length; i++) {
			arr[i] = i+1; // 1 ~ N 채우기
		}
		
		while(found != N) { // 모든 수가 빠질 때까지 반복한다.
			for(int i = 0; i<arr.length; i++) {
				if(arr[i]>0) {
					count++; 
					if(count == K) {
						newArr[found] = arr[i];
						arr[i] = 0;
						count = 0;
						found++;
					}
				}
			}
		}
		
		String result = Arrays.toString(newArr);
		result = result.replace("[", "<");
		result = result.replace("]", ">");
		
		System.out.println(result);
		
	}
}

처음에는 ArrayList로 풀려고 했다. while문 조건으로 !arr.isEmpty() 를 쓰려고 했기 때문인데 

그러면 접근도 arr.get(index)로 해야 하고 ...

메서드 편하다고 리스트 쓰기엔 조회가 배열보다 느리지 않나? 싶어서 그냥 배열로 구현했다.

 

출력 부분도 따로 로직을 써야 하나? 했는데 

생각해보니 괄호만 바꾸면 되잖아? 

 

 

'2024-?학기 ??? > Solving' 카테고리의 다른 글

BOJ 1157_단어 공부  (0) 2024.09.05
BOJ 2744_대소문자 바꾸기  (0) 2024.08.30
BOJ 1316_그룹 단어 체커  (0) 2024.08.27
BOJ 1236_성 지키기  (0) 2024.08.22
BOJ 8979_올림픽  (0) 2024.08.22

댓글