문제
반 학생들의 이름과 생일이 주어진다. 가장 나이가 많은(생일이 가장 이른) 학생과 가장 나이가 적은(생일이 가장 늦은) 학생의 이름을 각각 출력하는 문제이다.
입력
첫째 줄에 학생의 수 N이 주어진다. (1 ≤ N ≤ 100) 둘째 줄부터 N개의 줄에 이름, 일, 월, 연도 순으로 공백 구분되어 주어진다.
출력
첫째 줄에 나이가 가장 적은 학생(가장 늦게 태어난)의 이름, 둘째 줄에 나이가 가장 많은 학생(가장 일찍 태어난)의 이름을 출력한다.
예제
| 입력 | 출력 |
|---|---|
5 Ayu 16 8 1993 Arif 8 3 1990 Ari 20 9 1994 Budi 10 4 1995 Budi2 12 12 1994 | Budi Arif |
풀이
학생 정보를 배열에 저장한 뒤 연도 → 월 → 일 순으로 오름차순 정렬하여, 맨 앞(가장 이른 생일 = 최고령)과 맨 뒤(가장 늦은 생일 = 최연소)를 출력한다.
- N명의 학생 데이터를 2차원 배열
arr[N][4]에 저장한다 (인덱스 0: 이름, 1: 일, 2: 월, 3: 연도) - Comparator를 구현하여 연도(arr[i][3]) → 월(arr[i][2]) → 일(arr[i][1]) 순서로 비교한다
Arrays.sort로 정렬 후arr[N-1][0](최연소)과arr[0][0](최고령)을 출력한다
핵심 아이디어: 날짜를 연도-월-일 우선순위로 정렬하면 생일 비교를 단순 정렬 문제로 환원할 수 있다.
코드
package ASP_study.day299;
import java.util.*;
public class Day272BOJ5635생일 {
public static void main(String args[]) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
String arr[][] = new String[N][4];
for (int i = 0; i < N; i++) {
arr[i][0] = sc.next();
arr[i][1] = sc.next();
arr[i][2] = sc.next();
arr[i][3] = sc.next();
}
Arrays.sort(arr, new Comparator<String[]>() {
@Override
public int compare(String[] o1, String[] o2) {
if (Integer.parseInt(o1[3]) == Integer.parseInt(o2[3])) {
if (Integer.parseInt(o1[2]) == Integer.parseInt(o2[2])) {
return Integer.compare(Integer.parseInt(o1[1]), Integer.parseInt(o2[1]));
} else
return Integer.compare(Integer.parseInt(o1[2]), Integer.parseInt(o2[2]));
}
return Integer.compare(Integer.parseInt(o1[3]), Integer.parseInt(o2[3]));
}
});
System.out.println(arr[N - 1][0] + "\n" + arr[0][0]);
sc.close();
}
}복잡도
- 시간: O(N log N)
- 공간: O(N)