알고리즘/백준

[백준 10814번] 나이순 정렬(Java)

이채림 2024. 10. 29. 19:22

 

시간 제한 3
1 <= N <= 100,000

 

예제 입출력

 

이 문제에서는 나이순으로 정렬하고 나이가 같으면 가입한 순서를 유지해야 한다.

String 배열을 사용해 split으로 나이와 이름을 나눠 처리할 수도 있지만

ListComparator를 사용해서 풀어볼 것이다!

 

 

 

 

🔍 해결 방법

  • 회원 정보를 담는 Member 클래스 를 만들고 입력 순서를 유지하기 위해 List 에 저장한다.
  • Comparator 를 사용해 나이순으로 정렬하되 나이가 같을 경우에는 가입 순서를 유지하도록 설정한다.

 

 

 

 

📖 정답코드

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

class Member {
    int age;
    String name;

    Member(int age, String name) {
        this.age = age;
        this.name = name;
    }
}

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine());

        List<Member> members = new ArrayList<>();

        // 회원 정보 입력
        for(int i=0; i<N; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            int age = Integer.parseInt(st.nextToken());
            String name = st.nextToken();
            members.add(new Member(age, name));
        }

        // 정렬 : 나이순으로 정렬, 나이가 같으면 입력 순서 유지
        members.sort(Comparator.comparingInt((Member m) -> m.age));

        // 출력
        StringBuilder sb = new StringBuilder();
        for(Member m : members) {
            sb.append(m.age + " ").append(m.name).append("\n");
        }

        System.out.println(sb);
    }
}

 

이 코드의 핵심은 정렬 부분이다.

 

Comparator.comparingInt

: Java의 Comparator 클래스에서 제공하는 메서드로, 정렬 기준을 정수형 값으로 지정할 때 사용

 

Comparator.comparingInt((Member m) -> m.age)는

"각 Member 객체의 age 값을 기준으로 정렬하라"는 의미의 Comparator를 만든다.

Comparator 객체를 생성하는 정적 메서드이므로, new 연산자 없이 호출할 수 있다.

 

 

Stable Sort(안정 정렬)

Java의 List.sort()와 Collections.sort() 메서드는 안정 정렬 알고리즘을 사용한다.

즉, 정렬 조건이 동일할 경우 기존 순서를 유지한다.

➡️ 나이가 같은 경우 가입 순서대로 정렬 조건에 만족 😃