알고리즘/백준

[백준] 2750 -자바

삼록이 2025. 7. 23. 10:35

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

 

매우 간단한 문제다.

Arrays.sort() 한 번으로도 풀 수 있는 문제이나 버블정렬에 대한 구현을 직접 해볼 수 있는 문제라 풀어보는게 좋다.

버블정렬은 O(N^2)의 시간 복잡도를 가지고 있다.

이 문제의 제한시간은 1. 그러나 주어진 N의 최대 수는 1000이다. 따라서 최악의 경우 1000*1000=1,000,000. 백만번의 연산이 발생한다. 1초당 1억번의 연산이 걸린다고 일반적으로 잡으니 이 문제는 O(N^2)의 시간 복잡도여도 문제가 되지 않는다.


처음 풀었던 풀이이다. 이 문제도 정답이나 한가지 빠트린게 있으니 두번째 풀이도 보길 바란다.

public class Main {
    public static void main(String[] args) throws IOException {
        /*
        1.수의 개수를 받는다. n개의 수를 배열로 받는다
        2.for(int i=0; i<n; i++){
        if(arr[i]>arr[i+1){
            arr[i]와 arr[i+1]의 자리를 바꿔준다. =>버블정렬 1회차로 한자리수만 확정
        3.이걸 n개 만큼 반복
         */
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());
        int[] arr = new int[n];
        for(int i =0; i<n; i++){
            arr[i] = Integer.parseInt(br.readLine());
        }

        for(int i=0; i<n-1; i++) {
            for (int j = 0; j < n - 1; j++) {
                if (arr[j] > arr[j + 1]) {
                    int var = 0;
                    var = arr[j + 1];
                    arr[j + 1] = arr[j];
                    arr[j] = var;
                }
            }
        }
        StringBuilder sb = new StringBuilder();
        for(int a: arr){
            sb.append(a).append('\n');
        }
        System.out.println(sb);
    }
}

위 풀이와 차이점은 이중for문에서 내부 for문의 범위다.

기존에 n-1번까지 돌던걸 n-1-i번까지 도는 것에 차이가 있다.

오름차순으로 버블정렬을 한 번 돌리면 맨 마지막자리는 확정이 된다. 그러므로 다음번 반복에서는 이미 확정된 자리까지 비교할 필요가 없으므로 n-1-i가 되는 것이다. 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
    public static void main(String[] args) throws IOException {
        /*
        1.수의 개수를 받는다. n개의 수를 배열로 받는다
        2.for(int i=0; i<n; i++){
        if(arr[i]>arr[i+1){
            arr[i]와 arr[i+1]의 자리를 바꿔준다. =>버블정렬 1회차로 한자리수만 확정
        3.이걸 n개 만큼 반복. 반복할 때 끝까지 반복할 필요없다. 반복 한 번 돌때마다 확정된 자리수들이 생기니 그때는 반복하지 않아도된다.
         */
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());
        int[] arr = new int[n];
        for(int i =0; i<n; i++){
            arr[i] = Integer.parseInt(br.readLine());
        }

        for(int i=0; i<n-1; i++) {
            for (int j=0; j < n-1-i; j++) {
                if (arr[j] > arr[j + 1]) {
                    int var = 0;
                    var = arr[j + 1];
                    arr[j + 1] = arr[j];
                    arr[j] = var;
                }
            }
        }
        StringBuilder sb = new StringBuilder();
        for(int a: arr){
            sb.append(a).append('\n');
        }
        System.out.println(sb);
    }
}

'알고리즘 > 백준' 카테고리의 다른 글

[백준] 1432 - 자바  (4) 2025.07.23
[백준] 11268 - 자바  (3) 2025.07.21
[백준] 2164 - 자바  (2) 2025.07.21
[백준] 12891 -자바  (2) 2025.07.18
[백준] 1940 -자바  (1) 2025.07.17