CodeClover

[JAVA] 백준 5635_생일 본문

코딩테스트

[JAVA] 백준 5635_생일

coding dew 2025. 1. 9. 16:53

[문제링크]

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