Notice
Recent Posts
Recent Comments
Link
CodeClover
[JAVA] 백준 5635_생일 본문
[문제링크]
https://www.acmicpc.net/problem/5635
📌 문제 탐색하기
학생의 이름과 생일 정보를 활용해서 가장 나이가 적은 사람 ( = 즉, 가장 최근에 태어난 사람 ) 과 가장 나이가 많은 사람 ( = 즉, 가장 먼저 태어난 사람 ) 을 구해야한다.
문제를 풀어야하는 순서를 정리해보면,
1. 학생의 정보를 입력받고 -> 2. 학성 정보를 시간순으로 정렬시키고 -> 3. 정렬된 리스트에서 처음과 마지막 값을 출력
📌 가능한 시간복잡도
1. 정보를 입력 받는다. O(N)
2. 입력받은 정보를 정렬한다. O(N logN)
3. 정렬된 값에서 특정 순서의 값을 출력한다. O(1)
따라서, 가능한 시간복잡도는 O(N logN) 입니다.
📌 코드 설계하기
학생의 정보를 입력받고 -> 학성 정보를 시간순으로 정렬시키고 -> 정렬된 리스트에서 처음과 마지막 값을 출력
이 순서대로 코드를 설계하면 된다.
나이가 많은 순서대로 정렬했으므로 정렬된 첫번째 값이 나이가 가장 많은 사람이므로 출력, 정렬된 마지막 값은 나이가 가장 어린 사람임으로 출력하면 정답.
📌 정답 코드
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
sc.nextLine();
List<Student> students = new ArrayList<>();
for (int i = 0; i < n; i++) {
String name = sc.next();
int day = sc.nextInt();
int month = sc.nextInt();
int year = sc.nextInt();
students.add(new Student(name, day, month, year));
}
students.sort((s1, s2) -> {
if (s1.year != s2.year) {
return Integer.compare(s1.year, s2.year);
}
if (s1.month != s2.month) {
return Integer.compare(s1.month, s2.month);
}
return Integer.compare(s1.day, s2.day);
});
System.out.println(students.get(n - 1).name);
System.out.println(students.get(0).name);
}
}
class Student {
String name;
int day, month, year;
public Student(String name, int day, int month, int year) {
this.name = name;
this.day = day;
this.month = month;
this.year = year;
}
}
📌 실수 정리
1회차 : 정렬하도록 처리하는 부분에서 정렬 기준을 명확하게 세우지 못해서 어려움을 겪었음.
- 연도가 작을수록 나이 많음
- 동일한 연도에 태어난 경우 월을 비교해서 월이 작을수록 나이가 많다.
- 동일한 연도,월에 태어난 경우 일을 비교해서 정렬해야함.
'코딩테스트' 카테고리의 다른 글
| [JAVA] 백준 2947_나무 조각 (0) | 2025.01.11 |
|---|---|
| [JAVA] 백준 25305_커트라인 (1) | 2025.01.10 |
| [JAVA_백준 1181] 단어 정렬 (1) | 2025.01.08 |
| [JAVA_백준 10814] 나이순 정렬 (1) | 2025.01.07 |
| [JAVA_백준 2309] 일곱 난쟁이 (0) | 2025.01.06 |