❓ 문제
어떤 반에 있는 학생들의 생일이 주어졌을 때, 가장 나이가 적은 사람과 가장 많은 사람을 구하는 프로그램을 작성하시오.
📥 입력
첫째 줄에 반에 있는 학생의 수 n이 주어진다. (1 ≤ n ≤ 100)
다음 n개 줄에는 각 학생의 이름과 생일이 "이름 dd mm yyyy"와 같은 형식으로 주어진다. 이름은 그 학생의 이름이며, 최대 15글자로 이루어져 있다. dd mm yyyy는 생일 일, 월, 연도이다. (1990 ≤ yyyy ≤ 2010, 1 ≤ mm ≤ 12, 1 ≤ dd ≤ 31) 주어지는 생일은 올바른 날짜이며, 연, 월 일은 0으로 시작하지 않는다.
이름이 같거나, 생일이 같은 사람은 없다.
📤 출력
첫째 줄에 가장 나이가 적은 사람의 이름, 둘째 줄에 가장 나이가 많은 사람 이름을 출력한다.
📥 예제 입력
5
Mickey 1 10 1991
Alice 30 12 1990
Tom 15 8 1993
Jerry 18 9 1990
Garfield 20 9 1990
📤 예제 출력
Tom
Jerry
👩🏻💻 내 코드
package baekjoon.코테챌린지;
import java.util.*;
public class 생일{
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int N = in.nextInt();
String[][] arr = new String[N][4];
for(int i = 0; i < N; i++) {
arr[i][0] = in.next();
arr[i][1] = in.next();
arr[i][2] = in.next();
arr[i][3] = in.next();
}
//첫 번째 정렬 기준 : 연도
//두 번째 정렬 기준 : 월
//세 번째 정렬 기준 : 일
Arrays.sort(arr, new Comparator<String[]>() {
@Override
public int compare(String[] o1, String[] o2) {
// o1와 o2는 String. 즉 equals로 비교
if(o1[3].equals(o2[3])) {
if(o1[2].equals(o2[2])) {
return Integer.parseInt(o1[1]) - Integer.parseInt(o2[1]);
}
return Integer.parseInt(o1[2]) - Integer.parseInt(o2[2]);
}
return Integer.parseInt(o1[3]) - Integer.parseInt(o2[3]);
}
});
System.out.println(arr[N - 1][0]); // 나이가 가장 적은 사람
System.out.println(arr[0][0]); // 나이가 가장 많은 사람
}
}
💡 공부한 내용 <정렬>
- 우선 학생들의 데이터를 저장할 적절한 자료구조가 필요하다.
- 각 학생의 데이터를 배열 또는 리스트에 저장하는 것이 적합하다. 여기서는 String[][] 배열을 사용햇다.
- arr[i][0]: 이름
- arr[i][1]: 생일 일
- arr[i][2]: 생일 월
- arr[i][3]: 생일 연도
정렬을 사용해 나이 비교
( 두 개의 배열(o1, o2)을 비교하여 순서를 결정하는 Comparator<String[]>를 구현 )
생일을 비교하는 기준
- 제일 먼저 연도를 비교
- 연도가 같다면 월을 비교
- 월까지 같다면 일을 비교
Arrays.sort(arr, new Comparator<String[]>() {
@Override
public int compare(String[] o1, String[] o2) {
if (!o1[3].equals(o2[3])) {
return Integer.parseInt(o1[3]) - Integer.parseInt(o2[3]);
}
if (!o1[2].equals(o2[2])) {
return Integer.parseInt(o1[2]) - Integer.parseInt(o2[2]);
}
return Integer.parseInt(o1[1]) - Integer.parseInt(o2[1]);
}
});
정렬이 끝나면 가장 앞에 있는 사람이 가장 나이가 많은 사람 / 가장 뒤에 있는 사람이 가장 나이가 적은 사람
System.out.println(arr[N - 1][0]); // 나이가 가장 적은 사람
System.out.println(arr[0][0]); // 나이가 가장 많은 사람
<개념 정리>
Comparator 인터페이스
Arrays.sort(arr, new Comparator<String[]>() {
@Override
public int compare(String[] o1, String[] o2) {
- Arrays.sort() 메서드는 배열을 정렬할 때 사용하는 기본적인 정렬 메서드로 두 번째 인자로 Comparator를 넘겨 배열의 정렬 기준을 정의한다.
- Comparator<String[]>는 String 배열을 비교하기 위한 기준을 설정하기 위해 사용된다.
- compare(String[] o1, String[] o2)는 두 배열 o1과 o2를 비교하여 어느 것이 더 먼저 와야 할지를 결정하는 메서드다.
생년월일 비교를 위한 조건문
if (o1[3].equals(o2[3])) { // 연도가 같으면
if (o1[2].equals(o2[2])) { // 월까지 같으면
return Integer.parseInt(o1[1]) - Integer.parseInt(o2[1]);
}
return Integer.parseInt(o1[2]) - Integer.parseInt(o2[2]);
}
return Integer.parseInt(o1[3]) - Integer.parseInt(o2[3]);
- o1[3], o2[3]: 두 배열의 연도
- 즉, o1[3]은 첫 번째 학생의 생년월일 중 연도이고, o2[3]은 두 번째 학생의 연도
- o1[2], o2[2]: 월
- o1[1], o2[1]: 일
return Integer.parseInt(o❓[❓]) - Integer.parseInt(o❓[❓]); 과 같이 두 연도 / 월 / 일의 차이를 계산해 더 작은 쪽이 먼저 오도록 한다🌟🌟
반응형
'백준 문제 풀이' 카테고리의 다른 글
<코테 챌린지> 나무 조각 (백준 2947번) (1) | 2024.10.12 |
---|---|
<코테 챌린지> 커트라인 (백준 25305번) (1) | 2024.10.11 |
<코테 챌린지> 단어 정렬 (백준 1181번) (1) | 2024.10.09 |
<코테 챌린지> 나이순 정렬 (백준 10814번) (1) | 2024.10.09 |
(#10952 Java) A+B - 5 (0) | 2023.07.31 |