CodeClover

[JAVA] 백준 2947_나무 조각 본문

코딩테스트

[JAVA] 백준 2947_나무 조각

coding dew 2025. 1. 11. 23:27

 

[문제링크]

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

 

 

 

📌 문제 탐색하기

무작위로 입력된 1부터 5까지의 숫자조각을 1 2 3 4 5 순서로 정렬하는 문제이다. 

배열의 인접한 두 숫자를 비교하여 큰 숫자를 뒤로 가도록 순서를 변경하는 버블 정렬을 활용하는 문제이다.

두개의 숫자의 위치가 변경될 때마다 숫자 배열을 출력해야한다.

 

📌 가능한 시간복잡도

버블 정렬의 시간복잡도는 크게 2가지로 나뉜다.

 

1. 평균적 & 복잡한 시간복잡도

    : N개의 숫자를 입력받아 배열의 길이가 n인 경우 각각의 요소를 최대 (n-1)번 비교해야하기 때문에 시간 복잡도 O(N^2)       을 갖는다.

2. 간단하고 짧은 시간복잡도

    : 이미 정렬이 완료된 상태의 배열으로 입력된 경우 한번의 반복으로 정렬이 완료되기 때문에 비교적 간단한 시간

      복잡도 O(N) 을 갖는다. 

 

따라서, 가능한 시간복잡도는 O(N^2) 입니다.

해당 문제에서 주어진 최대 크기가 5이기 대문에 문제가 되지 않을것으로 보인다.

 

📌 코드 설계하기

1. 1 2 3 4 5 의 정렬된 순서가 될 때까지 반복해야하기 때문에 while 반복문을 활용하고 sorted로 배열의 정렬 상태를 확인하고 정렬된 상태이면 break; 로 반복문 종료하면 된다. 

2. 두개의 숫자를 비교해서 큰 숫자를 뒤로 가도록 순서를 변경해야하므로 wood[i] > wood[i+1] 으로 두개의 숫자를 비교해서 순서를 바꾸고 출력하기

3. 숫자 자리 바뀔때마다 배열 출력해야함!!! => for문 사용해서 출력

 

📌 정답 코드

import java.util.Scanner;

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

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

        while (true) {
            boolean sorted = true; 
            for (int i = 0; i < 4; i++) { 
                if (wood[i] > wood[i + 1]) {
                    int temp = wood[i];
                    wood[i] = wood[i + 1];
                    wood[i + 1] = temp;
                    
                    for (int j = 0; j < 5; j++) {
                        System.out.print(wood[j] + " ");
                    }
                    System.out.println();
                    sorted = false;
                }
            }
            if (sorted) break;
        }
    }
}

'코딩테스트' 카테고리의 다른 글

[JAVA] 백준 2578_빙고  (1) 2025.01.13
[JAVA] 백준 7568_덩치  (1) 2025.01.12
[JAVA] 백준 25305_커트라인  (1) 2025.01.10
[JAVA] 백준 5635_생일  (1) 2025.01.09
[JAVA_백준 1181] 단어 정렬  (1) 2025.01.08