알고리즘/백준
[백준 10814번] 나이순 정렬(Java)
이채림
2024. 10. 29. 19:22
시간 제한 3초
1 <= N <= 100,000
이 문제에서는 나이순으로 정렬하고 나이가 같으면 가입한 순서를 유지해야 한다.
String 배열을 사용해 split으로 나이와 이름을 나눠 처리할 수도 있지만
List와 Comparator를 사용해서 풀어볼 것이다!
🔍 해결 방법
- 회원 정보를 담는 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() 메서드는 안정 정렬 알고리즘을 사용한다.
즉, 정렬 조건이 동일할 경우 기존 순서를 유지한다.
➡️ 나이가 같은 경우 가입 순서대로 정렬 조건에 만족 😃