본문 바로가기
개발

효율적인 정렬 알고리즘 구현과 최적화 전략 배우기: 자바로 백준 2751번 문제 해결하기

by hes3518 2024. 11. 13.
728x90

자바로 효율적인 정렬 구현하기: 백준 2751번 문제를 통해 배우는 최적화 전략

안녕하세요, 개발자 여러분! 오늘은 알고리즘 문제 중 하나인 백준 2751번 "수 정렬하기 2"를 풀어보며 자바로 효율적인 정렬 알고리즘을 구현해보겠습니다. 이 포스트에서는 문제의 조건과 코드 작성 과정을 단계별로 설명하고, 최적화를 위한 몇 가지 팁을 공유하겠습니다.

문제 소개

백준 2751번 문제는 다음과 같은 조건 하에 주어진 수를 오름차순으로 정렬하는 것입니다.

  • 첫째 줄에 수의 개수 N(1 ≤ N ≤ 1,000,000)이 주어진다.
  • 둘째 줄부터 N개의 줄에 정수가 주어진다.
  • 출력은 주어진 수를 오름차순으로 정렬하여 한 줄에 하나씩 출력해야 한다.
  • 이 조건을 만족하면서도 2초 이내에 처리할 수 있어야 합니다.

이렇게 어려운 조건 속에서 우리의 목표는 효율적인 정렬 알고리즘을 구현하는 것입니다.

코드 구현

다음은 문제를 해결하기 위한 자바 코드입니다.

package com.baek.algo.step12;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class Q2751 {
    public static void main(String[] args) throws NumberFormatException, IOException {
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb  = new StringBuilder();

        int n = Integer.parseInt(bf.readLine());
        List<Integer> list = new ArrayList<Integer>();

        for(int i = 0; i < n; i++) {
            list.add(Integer.parseInt(bf.readLine()));
        }

        Collections.sort(list);

        for(int num : list) {
            sb.append(num).append("
");
        }

        System.out.println(sb);
        bf.close();
    }
}

코드 설명

  1. 입력 처리: BufferedReader를 사용하여 빠르게 입력을 받습니다. List<Integer>를 사용하여 입력된 숫자를 저장합니다.
  2. 정렬: Collections.sort()를 사용하여 리스트를 정렬합니다. 이 메소드는 병합 정렬 및 삽입 정렬을 혼합한 알고리즘을 사용하여 평균적으로 O(n log n)의 속도를 보장합니다.
  3. 출력 처리: StringBuilder를 사용하여 정렬된 결과를 한 번에 출력합니다. System.out.println() 대신 StringBuilder를 사용하는 이유는 출력 성능을 높이기 위함입니다.

최적화 팁

이 문제를 해결하는 과정에서 몇 가지 최적화 전략을 적용했습니다. 예를 들어, 표준 입력 및 출력 대신 BufferedReaderStringBuilder를 사용하여 성능을 극대화했습니다. 이렇게 하면 대량의 데이터 처리 시 성능 차이를 확연히 느낄 수 있습니다.

결과 및 마무리

해당 코드를 실행하면 주어진 숫자 리스트가 오름차순으로 정렬되어 출력됩니다. 많은 수를 처리하면서도 2초 이내에 결과를 출력할 수 있었습니다.

이제 여러분들도 다양한 알고리즘 문제를 풀면서 코드 최적화에 대해 고민해보세요. 프로그래밍 연습을 통해 효율적인 알고리즘을 구현하는 재미를 느끼실 수 있을 것입니다. 질문이 있거나 추가적인 도움이 필요하시다면 댓글로 남겨주세요. 감사합니다!

728x90