본문 바로가기
코딩테스트/programming_JAVA

[Java] baekjoon_10814 : 나이순 정렬

by prometedor 2024. 1. 12.

정렬

나이순 정렬 : Silver5

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

 

10814번: 나이순 정렬

온라인 저지에 가입한 사람들의 나이와 이름이 가입한 순서대로 주어진다. 이때, 회원들을 나이가 증가하는 순으로, 나이가 같으면 먼저 가입한 사람이 앞에 오는 순서로 정렬하는 프로그램을

www.acmicpc.net

 

 

풀이

import java.io.*;
import java.util.*;

public class Main16 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        int N = Integer.parseInt(br.readLine());
        String[][] arr = new String[N][2];
        
        for (int i = 0; i < N; i++) {
          StringTokenizer st = new StringTokenizer(br.readLine());
          arr[i][0] = st.nextToken();
          arr[i][1] = st.nextToken();
        }

        Arrays.sort(arr, (a, b) -> {
          return Integer.compare(Integer.parseInt(a[0]), Integer.parseInt(b[0]));
        });

        StringBuilder sb = new StringBuilder();

        for (int i = 0; i < N; i++) {
          sb.append(arr[i][0]).append(" ").append(arr[i][1]).append("\n");
        }
        bw.write(sb.toString());

        bw.flush();
        bw.close();
    }
}

 

 

 

람다 표현식

Arrays.sort(arr, (a, b) -> {
  return Integer.compare(Integer.parseInt(a[0]), Integer.parseInt(b[0]));
});

 

람다 표현식을 사용하여 Comparator를 정의하고, 나이를 정수로 변환한 뒤에 비교한다.

(a, b)는 두 개의 비교 대상을 나타낸다.
ㄴ Integer.compare(Integer.parseInt(a[0]), Integer.parseInt(b[0]))은 나이를 정수로 변환한 후에 나이를 비교한다.

Integer.compare 메서드는 두 정수를 비교하여 오름차순으로 정렬하도록 도와준다.
ㄴ 이렇게 정의된 Comparator를 사용하여 Arrays.sort 메서드로 배열을 정렬하면, 나이가 오름차순으로 정렬되며, 나이가 같을 경우에는 가입한 순서대로 정렬된다.

 

위 람다 표현식은 원래 아래와 같이 표현된다.

Arrays.sort(arr, new Comparator<String[]>() {
    @Override
    public int compare(String[] a, String[] b) {
        return Integer.compare(Integer.parseInt(a[0]), Integer.parseInt(b[0]));
    }
});

 

ㄴ Arrays.sort 메서드를 사용하여 이차원 배열인 arr을 정렬하는 부분이다.

ㄴ 정렬의 기준은 Comparator 인터페이스를 구현한 익명 클래스를 생성하여 제공한다.
ㄴ 여기서 사용된 Comparator의 compare 메서드를 통해 두 개의 문자열 배열을 비교하고 정렬 순서를 결정한다.

 

new Comparator<String[]>()

Comparator 인터페이스를 익명 클래스로 구현한다. 이 익명 클래스의 역할은 비교 로직을 제공하는 것이다.

 

compare(String[] a, String[] b)

두 개의 문자열 배열을 비교하는 메서드이다. 여기서는 배열의 첫 번째 요소, 즉 나이에 해당하는 부분을 정수로 변환하여 비교한다.

 

Integer.compare(Integer.parseInt(a[0]), Integer.parseInt(b[0]))

ㄴ a[0]과 b[0]을 정수로 변환한 후 비교하고, 이 결과를 반환한다.

 

 

나이가 같을 경우

나이가 동일한 회원들에 대해서는 가입한 순서대로 정렬된다. 이는 Arrays.sort 메서드를 사용할 때 기본적으로 안정적인 정렬을 수행하기 때문이다. 안정적인 정렬동일한 값에 대해 정렬 전의 상대적인 순서를 유지하는 특성을 갖는다.
따라서 나이가 같은 회원들은 원래 입력된 순서대로 정렬된다.

예를 들어, 먼저 입력된 회원이 먼저 정렬 결과에 나타나게 된다.

 

 


 

 

문제점 : Arrays.sort 를 이용해서 정렬하는 것은 생각했지만, 이를 커스텀하여 비교하는 것을 어떻게 하는지 몰랐다.

해결 방법 : 정렬 기준을 Comparator 인터페이스를 구현한 익명 클래스를 생성하여 설정하였다. 

깨달은 바 : Arrays.sort 의 정렬 기준을 만들어서 비교하는 방법에 대해 알게되었다. 그리고 Arrays.sort 를 이용하면 커스텀한 정렬 기준에 대해 정렬할 때 동일한 값에 대해서는 정렬 전의 상대적인 순서를 유지하는 특성을 가진다는 것을 알게되었다.