[백준] 10812번 : 바구니 순서 바꾸기 (JAVA)

인간몽쉘김통통·2023년 5월 14일

백준

목록 보기
7/92

문제

풀이

이해

N개의 바구니를 회전시키려고 한다. 회전시킬 바구니는 i, j, k를 입력받아 이루어지는데 i와 j는 회전시킬 바구니의 처음과 끝이고 k는 기준이 되는 바구니 번호이다.

회전은 k를 기준으로 이루어지는데 단순하게 k ~ j , i ~ j-1 로 바구니로 구성하면 된다. 예를 들어, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10의 바구니가 있을 때 i=1, j=6, k=3을 입력받았으면 1번부터 6번 바구니를 3번을 기준으로 회전시키면 된다. 회전시킨 결과는 3, 4, 5, 6, 1, 2, 7, 8, 9, 10이 되는 것이다.

바구니는 M번의 케이스에 대해서 각각 회전시켜야 한다. 회전이 끝나면 결과를 출력한다.

접근

간단하게 배열로 접근해보았다. 처음에는 한 개의 배열을 이용해 각 원소를 교환하여 회전시킬 생각이었지만 쉽지 않아보였다.

그래서 두 개의 배열을 이용해 보았다. 첫번째는 결과가 되는 바구니 배열(arr), 두번째는 범위안에서 회전시킨 결과를 임시로 담을 배열(rotateArr)이다.

회전시킨 결과를 rotateArr에 담는다. 이 때 범위 밖의 원소는 -1로 처리하여 회전 범위 밖임을 명시한다.

회전은 이전에 언급한 것처럼 k ~ j, i ~ j-1의 결과를 보일 수 밖에 없다. 따라서, 해당 범위의 바구니를 rotateArr에 순서대로 삽입하면 된다.

rotateArr을 구했으면 arr로 치환하면 된다. 이 때, 원소가 -1인 공간은 회전 범위 밖이기 때문에 치환하지 않는다.

코드

package java_baekjoon;

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

public class prob10812 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        StringBuilder sb = new StringBuilder();
        int N = sc.nextInt();
        int M = sc.nextInt();

        int[] arr = new int[N];

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

        while (M-- > 0) {
            int[] rotateArr = new int[N];
            Arrays.fill(rotateArr, -1);

            int i = sc.nextInt() - 1;
            int j = sc.nextInt() - 1;
            int k = sc.nextInt() - 1;

            int index_rotate = i;

            for (int index = k; index <= j; index++) {
                rotateArr[index_rotate++] = arr[index];
            }
            for (int index = i; index < k; index++) {
                rotateArr[index_rotate++] = arr[index];
            }

            for (int index = 0; index < N; index++) {
                if (rotateArr[index] != -1) {
                    arr[index] = rotateArr[index];
                }
            }
        }

        for (int i = 0; i < N; i++) {
            sb.append(arr[i] + " ");
        }

        System.out.println(sb.toString());

        sc.close();
        return;
    }
}

결과

profile
SW 0년차 개발자입니다.

0개의 댓글