ULISIA's Developer Life

[Backjoon] 10812번 바구니 순서 바꾸기 Java 문제 풀이 본문

Algorithm/Backjoon

[Backjoon] 10812번 바구니 순서 바꾸기 Java 문제 풀이

ULISIA 2023. 7. 9. 16:32

출처:10812번: 바구니 순서 바꾸기

문제 이해

  • 바구니의 수(N = 10개)
  • 회전 수(M = 5회)

1 2 3 4 5 6 7 8 9 10

  • 시작 바구니 (i = 1)
  • 끝 바구니 (j = 6)
  • 기준 바구니 (k = 4)

1 2 3 4 5 6 7 8 9 10
i i+1 k-1 k k+1 j j+1 j+2 j+3 j+4

4 5 6 1 2 3 7 8 9 10
k k+1 j i i+1 k-1 j+1 j+2 j+3 j+4

시작 바구니 i와 끝 바구니 j 사이의 순서를 바꾼다.

  1. 시작 바구니 i가 기준 바구니 k가 되고 k+1부터 끝 바구니 j까지 바꾼다.
  2. 바꾼 이후의 j+1 부터의 바구니는 바꾸기 전의 i부터 k-1까지의 바구니를 담는다.
  3. 이 과정을 M번 반복해서 최종적으로 나온 결과 값을 출력한다.

한번의 회전 과정에서의 변경되는 대상 바구니 수
i = 1 j = 6 k = 4

1 2 3 4 5 6 => 4 5 6 1 2 3 총 6개

i = 2 j = 5 k = 3

2 3 4 5 => 3 4 5 2 총 4개

j-i+1=변경할 대상 바구니 수

해답코드

package anystep;

import java.io.*;
import java.util.StringTokenizer;

public class Java_10812 {
    //바구니 순서 바꾸기
    static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
    static BufferedWriter out = new BufferedWriter(new OutputStreamWriter(System.out));
    static StringTokenizer stk;
    static StringBuilder sb = new StringBuilder();

    public static void main(String[] args) throws IOException {
        stk = new StringTokenizer(in.readLine());
        int N = Integer.parseInt(stk.nextToken());
        int M = Integer.parseInt(stk.nextToken());

        int[] basket = new int[N];
        int[] rotation = new int[N];

        for (int i = 0; i < N; i++) {
            basket[i] = i + 1;
        }

        for (int r = 0; r < M; r++) {
            stk = new StringTokenizer(in.readLine());
            int i = Integer.parseInt(stk.nextToken()) - 1;
            int j = Integer.parseInt(stk.nextToken()) - 1;
            int k = Integer.parseInt(stk.nextToken()) - 1;

            int begin = i;

            for (int move = 0; move < j - i + 1; move++) {
                if (k + move <= j) { //k~j
                    rotation[i + move] = basket[k + move];
                } else { //i~k
                    rotation[i + move] = basket[begin++];
                }
            }
            for (int move = 0; move < N; move++) {
                //rotation[move]가 0이면 회전과정에 포함되지 않았음.
                //0이 아니라면 회전을 한 경우
                if (rotation[move] != 0) {
                    basket[move] = rotation[move];
                }
            }
        }
        for (int i = 0; i < N; i++) {
            System.out.print(basket[i] + " ");
        }
    }
}