본문 바로가기
백준 문제 풀이

<코테 챌린지> 나무 조각 (백준 2947번)

by _비니_ 2024. 10. 12.

❓ 문제

동혁이는 나무 조각을 5개 가지고 있다. 나무 조각에는 1부터 5까지 숫자 중 하나가 쓰여져 있다. 또, 모든 숫자는 다섯 조각 중 하나에만 쓰여 있다.

동혁이는 나무 조각을 다음과 같은 과정을 거쳐서 1, 2, 3, 4, 5 순서로 만들려고 한다.

  1. 첫 번째 조각의 수가 두 번째 수보다 크다면, 둘의 위치를 서로 바꾼다.
  2. 두 번째 조각의 수가 세 번째 수보다 크다면, 둘의 위치를 서로 바꾼다.
  3. 세 번째 조각의 수가 네 번째 수보다 크다면, 둘의 위치를 서로 바꾼다.
  4. 네 번째 조각의 수가 다섯 번째 수보다 크다면, 둘의 위치를 서로 바꾼다.
  5. 만약 순서가 1, 2, 3, 4, 5 순서가 아니라면 1 단계로 다시 간다.

처음 조각의 순서가 주어졌을 때, 위치를 바꿀 때 마다 조각의 순서를 출력하는 프로그램을 작성하시오.

 

📥 입력

첫째 줄에 조각에 쓰여 있는 수가 순서대로 주어진다. 숫자는 1보다 크거나 같고, 5보다 작거나 같으며, 중복되지 않는다. 처음 순서는 1, 2, 3, 4, 5가 아니다.

 

📤 출력

두 조각의 순서가 바뀔때 마다 조각의 순서를 출력한다.

 

📥 예제 입력

2 1 5 3 4

 

📤 예제 출력

1 2 5 3 4
1 2 3 5 4
1 2 3 4 5

 

👩🏻‍💻 내 코드

package baekjoon.코테챌린지;

import java.util.Scanner;

public class 나무조각 {

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);

        int[] arr = new int[5];

        for(int i = 0; i < 5; i++) {
            arr[i] = in.nextInt();
        }

        while (true) {
            boolean isSorted = true;

            for(int i = 0; i < 4; i++) {
                if(arr[i] > arr[i+1]) {
                    change(arr, i, i+1);
                    isSorted = false;
                }
            }
            if(isSorted){
                break;
            }
        }
    }

    static void change(int arr[],int i, int j) {

        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;

        for (int k = 0; k < 5; k++) {
            System.out.print(arr[k] + " ");
        }
        System.out.println();
    }
}

 

💡 공부한 내용 <boolean flag, 함수 사용>

 

불린 플래그(isSorted)를 사용하여 불필요한 반복을 줄일 수 있다.

  • 만약 배열이 이미 정렬 완료된 상태라면, 불필요한 비교를 하지 않고 루프를 빠져나갈 수 있다. if (isSorted) { break;}

두 요소를 교환하고 배열을 출력하는 로직을 change 함수로 분리했다.

  • 사실 이번 코드에서는 굳이 필요 없는 함수였을 수 있지만, 중복 코드를 줄이고, 필요할 때마다 재사용할 수 있기에 함수로 분리하는 연습을 해놓으면 좋을 것 같다.

 

🚨 마주했던 오류 <런타임 오류>

for(int i = 0; i < 4; i++) {
    if(arr[i] > arr[i+1]) {
        change(arr, i, i+1);
        isSorted = false;
    }
}
  • 처음엔 위에 코드에서 i < 4를 i < 5로 잘못 작성하여 런타임 에러를 마주했다. 배열 범위 초과 오류는 생각보다 많이 마주할 수 있기에 정확히 알아보고 가자.
    • 내가 비교한 조건이 arr[i] > arr[i+1] 이었으므로 주의 해야한다.
      • 배열의 마지막 인덱스는 4이다.
      • i가 4일 때 arr[5]를 참조하려고 하기 때문에 배열 범위를 초과하는 오류가 발생한다.
반응형