© 2025 anveloper.dev
GitHub·LinkedIn·Contact

목차

  • 문제
  • 입력
  • 출력
  • 예제
  • 풀이
  • 코드
  • 복잡도
풀이 목록으로 돌아가기

BOJ 5635 - 생일

2022-11-06
BOJ
실버 V
java
원본 문제 보기
구현
문자열
정렬

문제

BOJ 5635 - 생일

반 학생들의 이름과 생일이 주어진다. 가장 나이가 많은(생일이 가장 이른) 학생과 가장 나이가 적은(생일이 가장 늦은) 학생의 이름을 각각 출력하는 문제이다.

입력

첫째 줄에 학생의 수 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 1994Budi Arif

풀이

학생 정보를 배열에 저장한 뒤 연도 → 월 → 일 순으로 오름차순 정렬하여, 맨 앞(가장 이른 생일 = 최고령)과 맨 뒤(가장 늦은 생일 = 최연소)를 출력한다.

  1. N명의 학생 데이터를 2차원 배열 arr[N][4]에 저장한다 (인덱스 0: 이름, 1: 일, 2: 월, 3: 연도)
  2. Comparator를 구현하여 연도(arr[i][3]) → 월(arr[i][2]) → 일(arr[i][1]) 순서로 비교한다
  3. 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)