본문 바로가기
백준 문제 풀이

<코테 챌린지> 생일 (백준 5635번)

by _비니_ 2024. 10. 10.

❓ 문제

어떤 반에 있는 학생들의 생일이 주어졌을 때, 가장 나이가 적은 사람과 가장 많은 사람을 구하는 프로그램을 작성하시오.

 

📥 입력

첫째 줄에 반에 있는 학생의 수 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❓[❓]); 과 같이 두 연도 / 월 / 일의 차이를 계산해 더 작은 쪽이 먼저 오도록 한다🌟🌟

반응형