❓ 문제
동혁이는 나무 조각을 5개 가지고 있다. 나무 조각에는 1부터 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]를 참조하려고 하기 때문에 배열 범위를 초과하는 오류가 발생한다.
- 내가 비교한 조건이 arr[i] > arr[i+1] 이었으므로 주의 해야한다.
반응형
'백준 문제 풀이' 카테고리의 다른 글
<코테 챌린지> 빙고 (백준 2578번) (1) | 2024.10.14 |
---|---|
<코테 챌린지> 덩치 (백준 7568번) (0) | 2024.10.13 |
<코테 챌린지> 커트라인 (백준 25305번) (1) | 2024.10.11 |
<코테 챌린지> 생일 (백준 5635번) (0) | 2024.10.10 |
<코테 챌린지> 단어 정렬 (백준 1181번) (1) | 2024.10.09 |