문제 출처 - Baekjoon Online Judge
문제는 여기
[문제]
어떤 반에 있는 학생들의 생일이 주어졌을 때, 가장 나이가 적은 사람과 가장 많은 사람을 구하는 프로그램을 작성하시오.
[입력]
첫째 줄에 반에 있는 학생의 수 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]);
}
}
'문제 풀이 > Baekjoon' 카테고리의 다른 글
[백준] S4 1543번 문서 검색 (JAVA) (0) | 2021.12.11 |
---|---|
[백준] G4 9935번 문자열 폭발 (JAVA) (0) | 2021.12.09 |
[백준] S5 11507번 카드셋트 (JAVA) (0) | 2021.12.07 |
[백준] S3 9996번 한국이 그리울 땐 서버에 접속하지 (JAVA) (0) | 2021.12.05 |
[백준] S4 14490번 백대열 (JAVA) (0) | 2021.12.04 |