미소를뿌리는감자의 코딩

[백준 2024/01/19] 요세푸스 문제 0 본문

코딩 테스트/백준

[백준 2024/01/19] 요세푸스 문제 0

미뿌감 2024. 1. 19. 19:51
728x90

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

 

11866번: 요세푸스 문제 0

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

www.acmicpc.net

 

1. 접근 방법

이번 문제의 경우, 1021번 (회전하는 큐) 문제와 유사하다고 생각이 들었다. 

이는 1021번 보다는 더 쉬운 문제라는 생각이 들었다.

 

왜냐하면, 1021번 문제의 경우 돌리는 방향을 왼쪽 or 오른쪽으로 결정해줘야 하는 문제가 있었는데,

이번 문제는 한 방향으로 돌리고, 돌리는 횟수도 정해져 있기 때문이다.

 

 처음 코드를 작성하고 출력하여 보았을 때,

처음 숫자를 제외하고 잘 작성이 되지 않아 어떤 부분을 놓쳤나 확인해 보니,

 

원하는 값을 출력하기 위해, deque.removeFirst()를 하게 되었을 때, 

우리가 원하는 방향과 반대로 값들이 땡겨져 왔기 때문임을 알 수 있었다.

 

따라서 removeFirst()를 하고 난 후

deque.addFirst(deque.removeLast());

를 통해서 원하는 대로 다음 숫자가 땡겨져 올 수 있도록 하였다.

 

2. 코드

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.Deque;
import java.util.ArrayDeque;


public class b11866 {
    public static void main(String[] args) throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        String line = reader.readLine();
        String[] num = line.split("\\s+");

        Deque<Integer> deque = new ArrayDeque<>();

        int total_num = Integer.parseInt(num[0]);
        deque.addLast(total_num);
        for (int i = 1; i < total_num; i++) {
            deque.addLast(i);
        }

        int add_last;
        System.out.print("<");
        for (int k = 0; k < total_num; k++) {
            for (int i = 0; i < Integer.parseInt(num[1]); i++) {
                deque.addLast(deque.removeFirst());
            }

            System.out.print(deque.removeFirst());
            if (k != total_num - 1) {
                System.out.print(", ");
                deque.addFirst(deque.removeLast());
            } else {
                System.out.print(">");
            }


        }

    }

}
728x90