[백준] 5635번 생일 Python

inkuu·2024년 11월 7일

✖️알고리즘➗

목록 보기
4/23

문제

어떤 반에 있는 학생들의 생일이 주어졌을 때, 가장 나이가 적은 사람과 가장 많은 사람을 구하는 프로그램을 작성하시오.

입력

첫째 줄에 반에 있는 학생의 수 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

문제 탐색하기

학생들의 생년월일이 주어졌을 때 나이가 가장 적은 사람과 가장 많은 사람을 구하는 문제.
주어진 조건:

  • 학생의 수 n (1 ≤ n ≤ 100)
  • 다음 n개의 줄은 각 학생의 이름과 생일

가능한 시간복잡도
timsort 알고리즘을 사용해야 하기 때문에 N log N 정렬 알고리즘으로결정

알고리즘 선택

년, 월, 일을 기준으로 정렬하고, 리스트의 첫 번째와 마지막 원소를 조회하여 가장 나이 많은 사람과 가장 어린 사람을 찾기.
정렬 알고리즘으로 접근해 보겠습니다.

코드 설계하기

  1. for문 첫 줄에서 학생의 수 n을 입력받습니다.
  2. 다음 줄부터 각 학생의 이름과 생일 정보를 입력받아 튜플로 감싸 리스트에 저장합니다.
  3. 각 학생의 생일은 년, 월, 일 순으로 저장하여 나중에 쉽게 비교할 수 있게 합니다.
  4. 리스트를 오름차순으로 정렬합니다.
  5. 정렬 기준은 년, 월, 일 순서로 설정해 생일이 빠를수록 리스트의 앞쪽에 오도록 정렬합니다.
  6. 정렬이 완료되면 리스트의 첫 번째 요소가 가장 나이가 많은 사람이고 마지막 요소가 가장 나이가 어린 사람입니다.
  7. 그렇게 해서 가장 나이가 많은 사람과 가장 어린 사람의 이름을 각각 출력합니다.

시도 회차 수정 사항

1회차

처음엔 람다를 사용해서 구현했으나 더 생각한 결과, 리스트나 튜플안의 요소들이 인덱스의 순서대로 비교하며 정렬하기 때문에 람다를 사용하지 않고 구현해 sort함수를 사용하면 간단하게 할 수 있어 수정함.

코드 구현

import sys

list_ = []

for i in range(int(sys.stdin.readline())):
    name, day, month, year = sys.stdin.readline().split()
    list_.append((int(year), int(month), int(day), name))

list_.sort()

print(list_[-1][3])
print(list_[0][3])

0개의 댓글