본문 바로가기

문제 풀이/Baekjoon

[백준] S5 5635번 생일

문제 출처 - Baekjoon Online Judge

문제는 여기

 

5635번: 생일

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

www.acmicpc.net

[문제] 

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

[입력]

첫째 줄에 반에 있는 학생의 수 n이 주어진다. (1 ≤ n ≤ 100)

다음 n개 줄에는 각 학생의 이름과 생일이 "이름 dd mm yyyy"와 같은 형식으로 주어진다. 이름은 그 학생의 이름이며, 최대 15글자로 이루어져 있다. dd mm yyyy는 생일 일, 월, 연도이다. (1990 ≤ yyyy ≤ 2010, 1 ≤ mm ≤ 12, 1 ≤ dd ≤ 31) 주어지는 생일은 올바른 날짜이며, 연, 월 일은 0으로 시작하지 않는다.

이름이 같거나, 생일이 같은 사람은 없다.

[출력]

첫째 줄에 가장 나이가 적은 사람의 이름, 둘째 줄에 가장 나이가 많은 사람 이름을 출력한다.

 

 


[풀이]

1. Comparator를 사용해서 정렬 방식을 재정의해준다.

2. 재정의를 해주면서 Integer형으로 정의를 할지, String형으로 할지 정해서 한다. (아래는 String)

3. String형이기 때문에 한 자릿수와 두 자릿수 비교 시 문제가 발생한다.

4. 이를 해결해 주기 위해 입력받으면서 한 자릿수의 경우 앞에 '0'을 붙여준다.

[접근]

1. 문자열로 입력을 받은 값을 생일, 월, 일 순으로 정렬해준다.

2. 이때, compare를 재정의를 해주어야 하는데 Comparator를 사용해 재정의 해준다.

3. 문자열로 비교를 하기 때문에 한 자릿수의 경우 잘못된 결과를 리턴하는 경우가 있으므로 한 자릿수일 경우에 0을 앞에 붙여준다.

[코드]

package BOJ_silver;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Comparator;
import java.util.StringTokenizer;

public class Main_S5_5635 {
	static int n;
	static String str[][]; // 정보입력

	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		n = Integer.parseInt(br.readLine());
        str = new String[n][4]; // 이름, 일, 월, 년
 
        for (int i = 0; i < n; i++) {
        	StringTokenizer st = new StringTokenizer(br.readLine());
            str[i][0] = st.nextToken(); // 이름
            str[i][1] = st.nextToken(); // 일
            str[i][2] = st.nextToken(); // 월
            str[i][3] = st.nextToken(); // 년
            
            
            // 이렇게 해주지 않으면 12가 9보다 작다는 결과가 나온다
            if (str[i][1].length() == 1) // 입력받은 일이 1자리수 (1~9)일 경우 앞에 0을 추가로 붙여준다.
            	str[i][1] = "0" + str[i][1];
            
            if (str[i][2].length() == 1) // 입력받은 달이 1자리수 (1~9)일 경우 앞에 0을 추가로 붙여준다.
            	str[i][2] = "0" + str[i][2]; 
        }
 
        // 정렬 재정의
        Arrays.sort(str, new Comparator<String[]>() {
            @Override
            public int compare(String[] o1, String[] o2) {
                if (o1[3].compareTo(o2[3]) == 0) {
                    if (o1[2].compareTo(o2[2]) == 0) {
                        return o1[1].compareTo(o2[1]);
                    } else {
                        return o1[2].compareTo(o2[2]);
                    }
                }
                return o1[3].compareTo(o2[3]);
            }
        });
 
        // 출력
        System.out.println(str[n - 1][0] + "\n" + str[0][0]);
    }
}