코딩테스트/백준
백준 : 5635번 생일 (JAVA)
i3434o
2023. 11. 21. 20:57
목차
JAVA 풀이 5635번 생일
문제
어떤 반에 있는 학생들의 생일이 주어졌을 때,
가장 나이가 적은 사람과 가장 많은 사람을 구하는 프로그램을 작성하시오.
입력
첫째 줄에 반에 있는 학생의 수 n이 주어진다. (1 ≤ n ≤ 100)
다음 n개 줄에는 각 학생의 이름과 생일이 "이름 dd mm yyyy"와 같은 형식으로 주어진다.
이름은 그 학생의 이름이며, 최대 15글자로 이루어져 있다.
dd mm yyyy는 생일 일, 월, 연도이다. (1990 ≤ yyyy ≤ 2010, 1 ≤ mm ≤ 12, 1 ≤ dd ≤ 31)
주어지는 생일은 올바른 날짜이며, 연, 월 일은 0으로 시작하지 않는다.
이름이 같거나, 생일이 같은 사람은 없다.
출력
첫째 줄에 가장 나이가 적은 사람의 이름, 둘째 줄에 가장 나이가 많은 사람 이름을 출력한다.
예제 입력1
5
Mickey 1 10 1991
Alice 30 12 1990
Tom 15 8 1993
Jerry 18 9 1990
Garfield 20 9 1990
예제 출력1
Tom
Jerry
풀이 (리팩토링 전)
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int studentNum = Integer.parseInt(br.readLine());
String[][] student = new String[studentNum][2];
for(int i = 0; i < studentNum; i++) {
String[] info = br.readLine().split(" ");
student[i][0] = info[0];
if(Integer.parseInt(info[2]) < 10) {
info[2] = 0 + info[2];
}
if(Integer.parseInt(info[1]) < 10) {
info[1] = 0 + info[1];
}
student[i][1] = info[3] + info[2] + info[1];
}
Arrays.sort(student, (o1, o2) -> {
return Integer.compare(Integer.parseInt(o1[1]), Integer.parseInt(o2[1]));
});
String youngest = student[studentNum - 1][0];
String oldest = student[0][0];
System.out.println(youngest);
System.out.println(oldest);
}
}
수정할 생각으로 정답 목적 막 작성한 코드
1. 2차원 배열을 생성
2. 이름과 생년월일을 저장
3. 생년월일 기준으로 오름차순 정렬
4. 막내(배열의 맨 뒤), 첫째(배열의 맨 앞)을 출력
풀이 (리팩토링 후)
import java.io.*;
import java.util.*;
class Student {
String name;
int year, month, day;
public Student(String name, int year, int month, int day) {
this.name = name;
this.year = year;
this.month = month;
this.day = day;
}
public int getBirthDate() {
return year * 10000 + month * 100 + day;
}
}
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int studentNum = Integer.parseInt(br.readLine());
Student[] students = new Student[studentNum];
for(int i = 0; i < studentNum; i++) {
String[] info = br.readLine().split(" ");
String name = info[0];
int year = Integer.parseInt(info[3]);
int month = Integer.parseInt(info[2]);
int day = Integer.parseInt(info[1]);
students[i] = new Student(name, year, month, day);
}
Arrays.sort(students, Comparator.comparingInt(Student::getBirthDate));
Student youngest = students[studentNum - 1];
Student oldest = students[0];
System.out.println(youngest.name);
System.out.println(oldest.name);
}
}
2차원 배열 대신 Student 클래스를 만들어 학생 정보를 저장하였다.
생년월일을 정수형으로 표현
public int getBirthDate() {
return year * 10000 + month * 100 + day;
}
year 4자리 수, month 2자리 수, day 2자리
배열 정렬
Arrays.sort(students, Comparator.comparingInt(Student::getBirthDate));
앞서 생년월일을 정수형으로 표현한 메서드를 가지고 배열을 정렬한다.