문제
문제 탐색하기
1. input 값 가공하기
입력받는 n개의 줄은 "이름 dd mm yyyy" 형태로 들어옵니다. 여기서 input 값을 yyyymmdd 형태로 세팅하게되면 나이를 비교하기가 훨씬 편할 것입니다.
input 값의 연도, 월, 일의 범위는 다음과 같습니다. (1990 ≤ yyyy ≤ 2010, 1 ≤ mm ≤ 12, 1 ≤ dd ≤ 31)
따라서 생년은 4자리이고 월과 일은 1자리로 들어올 수 있습니다. 월과 일이 1자리일 경우 앞에 0을 붙이는 작업을 해서 생년월일을 8자리로 세팅합니다.
2. 생년월일 비교하기
가장 나이가 적은 사람의 이름과 가장 나이가 많은 사람의 이름을 출력하기 위해서는 입력받은 생년월일을 비교하여야 합니다.
여기서 주의할 점은 숫자가 클수록 나이가 많은 것이 아니라는 점을 고려해야합니다. 생년월일은 숫자가 클수록 나이가 어리고 작을 수록 나이가 많습니다.
처음엔 비교를 시작할 변수를 세팅합니다. 가장 적은 나이를 세팅하는 youngAge 라는 변수와 가장 많은 나이를 세팅하는 oldAge 변수를 선언하고 해당 변수의 초기값은 문제에서 주어진 input 값의 범위중 최솟값과 최댓값을 세팅해주면 됩니다.
youngAge = 19900101, oldAge = 20101231
위처럼 세팅한 이유는 input 값과 비교하면서 youngAge보다 큰 값이 입력되었다면 더 어린 나이이기 때문에 변수를 초기화 시켜 재세팅해주기 위함입니다. oldAge도 마찬가지 이구요.
이렇게 입력받으면서 비교를 진행하면 최종적으로 가장 나이가 많은 사람과 가장 나이가 적은 사람을 출력할 수 있습니다.
코드 설계하기
- 학생 수를 입력받아 n 세팅
- 나이를 비교하기 위해 주어진 범위의 최솟값과 최댓값을 변수에 세팅
- 나이가 가장 많은 사람과 적은 사람의 이름을 출력하기 위한 String 변수를 미리 선언
- input 값을 공백으로 split하여 배열에 저장하면 아래와 같으며 StringBuilder를 통해서 'yyyymmdd' 형태로 생년월일을 세팅합니다. (arr[1], arr[2]의 길이가 1일 경우 앞에 "0"을 붙여줍니다.)
- arr[0] : 이름
- arr[1] : 일
- arr[2] : 월
- arr[3] : 연도
- 나이를 비교해서 이름 변수에 arr[0]을 세팅해줍니다.
- 생년월일이 주어진 범위의 최솟값보다 크면 더 나이가 어리다고 생각하고 변수를 재선언해줍니다. 이때 어린 사람의 이름을 세팅하는 string 타입의 변수에도 input 값의 이름 데이터를 세팅해줍니다.
- 생년월일이 주어진 범위의 최대값보다 크면 더 나이가 많다고 생각하고 나이를 저장하는 변수와 이름 변수에도 데이터를 세팅해줍니다.
- 이렇게 해서 저장된 이름 변수를 출력합니다.
시도 회차 수정 사항
1회차) 순간 숫자만 생각해서 나이가 제일 많은 사람이 제일 큰 숫자를 지니고 있을거라고 생각하였습니다. 나이는 생년월일을 int로 변환하면 값이 클수록 어리고 작을수록 많다는 것을 인지하고 풀이를 진행했습니다.
정답 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Birthday {
public static void main(String[] args) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
// 1. 반의 학생 수 n을 세팅
int n = Integer.parseInt(reader.readLine());
// 2. 나이를 비교하기 위해 주어진 범위의 생일의 최소값과 최대값을 변수에 세팅
int youngAge = 19900101;
int oldAge = 20101231;
// 3. 나이가 가장 많은 사람과 적은 사람을 출력하기 위한 변수 선언
String old = "";
String young = "";
StringBuilder sb = new StringBuilder();
while(n-- > 0){
String[] arr = reader.readLine().split(" ");
// 4. arr[3] : 출생연도, arr[2] : 월, arr[1] : 일
// arr[2], arr[1] 이 1자리 일때 앞에 0을 더하고 생년월일을 8자리로 세팅한다.
sb.append(arr[3])
.append(arr[2].length() == 1 ? "0" + arr[2] : arr[2])
.append(arr[1].length() == 1 ? "0" + arr[1] : arr[1]);
int birth = Integer.parseInt(sb.toString());
// 5. 나이 비교
if(birth > youngAge) {
// 5-1. 나이가 더 어린사람의 나이와 이름을 변수에 저장하여 최종적으로 나이가 적은 사람의 이름이 young변수에 변수에 담아져있을 겁니다.
youngAge = birth;
young = arr[0];
}
if(birth < oldAge){
// 5-1. 나이가 더 많은사람의 나이와 이름을 변수에 저장하여 최종적으로 나이가 많은 사람의 이름이 old 변수에 담아져있을 겁니다.
oldAge = birth;
old = arr[0];
}
// 6. StringBuilder 리셋
sb.setLength(0);
}
// 7. 출력
System.out.println(young);
System.out.println(old);
}
}