[Algorithm/Java] 백준 10814번 - 나이순 정렬
https://www.acmicpc.net/problem/10814
📌 문제
문제 유형
- 정렬
문제 설명
- 나이를 기준으로 오름차순 정렬
- 나이가 같으면 먼저 가입한 사람이 먼저 출력
입출력 예시
입력
3
21 Junkyu
21 Dohyun
20 Sunyoung
출력
20 Sunyoung
21 Junkyu
21 Dohyun
🔍 문제 풀이
배열 정렬 메서드
Arrays.sort()
는 배열을 정렬할 때 쓰는 메서드- 첫 번째 인자는 정렬할 배열이고, 두 번째는 정렬 방법(기준)을 설정하는 Comparator
- 예를 들어, 내림차순으로 정렬하고 싶을 땐 아래와 같이 하면 됨
Arrays.sort(arr, Comparator.reverseOrder());
Comparator
Arrays.sort(arr, Comparator.comparingInt(a -> Integer.parseInt(a[0])));
- Comparator는 두 객체를 비교해 정렬 순서를 결정 (뜻: Comparator - 비교기)
comparingInt()
메서드는 정수값을 비교할 때 쓰이며, 정수형으로 변환된 값을 기준으로 정렬 (뜻: comparing - 비교하는)
람다 표현식
(a -> Integer.parseInt(a[0]))
- a는 배열의 각 요소 (
arr[i]
)로, 여기서는 String[] 타입 (arr의 타입이String[][]
이기 때문) - 예를 들어 {나이, 이름} 형태
- 따라서 a[0]을 기준으로 정렬하려면
Integer.parseInt(a[0])
는 각 요소의 첫 번째 항목(나이)을 정수로 변환하여 비교 기준으로 사용
💻 전체 코드
import java.io.*;
import java.util.*;
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());
// 배열에 나이와 이름을 저장
String[][] arr = new String[n][2];
for(int i = 0; i < n; i++){
StringTokenizer st = new StringTokenizer(br.readLine());
arr[i][0] = st.nextToken(); // age
arr[i][1] = st.nextToken(); // name
}
// 나이순으로 정렬, 같은 나이면 입력 순서 유지 (안정정렬)
Arrays.sort(arr, Comparator.comparingInt(a -> Integer.parseInt(a[0])));
// 결과 출력
StringBuilder sb = new StringBuilder();
for(String[] person : arr) { // person: 각 사람의 [나이, 이름] 정보를 담은 배열 (e.g., person = ["21", "Junkyu"])
sb.append(person[0]).append(" ").append(person[1]).append("\n");
}
System.out.println(sb);
}
}
arr가 2차원 배열 (String[][])
이면, arr의 각 요소는 1차원 배열 (String[])
💭 느낀 점
- 평소에 파이썬으로만 문제를 풀다가 자바로 처음 접근해보니 낯설고 어렵게 느껴졌다.
- 특히 배열 선언이나
Comparator
문법이 익숙하지 않아서 헷갈리지만, 반복하면 익숙해지겠지
🔁 복습 템플릿
import java.io.*;
import java.util.*;
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());
String[][] arr = new String[n][2];
for(int i = 0; i < n; i++){
StringTokenizer st = new StringTokenizer(br.readLine());
arr[i][0] = st.nextToken(); // age
arr[i][1] = st.nextToken(); // name
}
// 정렬
// 결과 출력
}
}
댓글남기기