[파이썬/Python] 백준 5635번: 생일

·2024년 6월 27일
0

알고리즘 문제 풀이

목록 보기
4/105
post-thumbnail

📌 문제 : 백준 5635번



📌 문제 탐색하기

n : 반에 있는 학생의 수 (1 ≤ n ≤ 100)
name : 학생의 이름 (1 ≤ name ≤ 15)
yyyy : 태어난 연도 (1990 ≤ yyyy ≤ 2010)
mm : 생일 월 (1 ≤ mm ≤ 12)
dd : 생일 일 (1 ≤ dd ≤ 31)

✅ 입력 조건
1. 연, 월, 일은 0으로 시작하지 않는다.
2. 이름이 같거나 생일이 같은 사람은 없다.
✅ 출력 조건
1. 첫째 줄 : 가장 나이가 적은 사람의 이름 출력
2. 둘째 줄 : 가장 나이가 많은 사람의 이름 출력

날짜를 이용해 계산하는 문제이기 때문에 datetime 라이브러리를 사용하려고 한다.

먼저, 오늘 날짜를 datetime.today().date()함수를 통해 '연-월-일' 형태로 저장한다.

today = datetime.today().date()

그 후, 학생의 이름과 생일을 입력받고 첫번째 공백 기준으로 이름일 월 연도를 구분하여 저장한다.

students = [input().strip().split(' ', 1) for _ in range(n)]

입력받은 일 월 연도 문자열을 strptime() 함수를 통해 날짜 객체로 만들어 리스트에 다시 저장한다.

for student in students:
    student[1] = datetime.strptime(student[1], '%d %m %Y').date()

오늘 날짜 기준으로 각 학생의 나이를 일 단위로 계산해준다.

for student in students:
    age = (today - student[1]).days
    student.append(age)

가능한 시간복잡도

for문으로 n번 반복 → O(n)O(n)
sort() 함수로 정렬 → O(nlogn)O(nlogn)

최종 시간복잡도
O(nlogn)O(nlogn) 이므로 최악의 경우에도 1억번 이하로 연산 가능하다.

알고리즘 선택

sort() 함수로 정렬



📌 코드 설계하기

  1. datetime 라이브러리를 호출한다.
  2. 오늘 날짜를 변수에 저장한다.
  3. n을 입력받는다.
  4. n만큼 반복해서 이름과 생일을 입력받는다.


📌 정답 코드

import sys

# 1. datetime 라이브러리의 datetime 모듈을 호출한다.
from datetime import datetime

input = sys.stdin.readline

# 2. 오늘 날짜를 변수에 저장한다.
today = datetime.today().date()

# 3. n을 입력받는다.
n = int(input())

# 4. n만큼 반복해서 이름과 생일을 입력받는다.
students = [input().strip().split(' ', 1) for _ in range(n)]

# 5. 입력받은 생일을 날짜 객체로 변경한다.
for student in students:
    student[1] = datetime.strptime(student[1], '%d %m %Y').date()

# 6. 나이를 계산한다.
for student in students:
    age = (today - student[1]).days
    student.append(age)

# 7. 나이순으로 정렬한다.
students.sort(key=lambda x: x[2])

# 8. 원하는 형태로 출력한다.
print(students[0][0])
print(students[-1][0])
  • 결과

다른 풀이

import sys

input = sys.stdin.readline

students = []

n = int(input())

for _ in range(n):
    name, day, month, year = input().rstrip().split()
    day, month, year = map(int, (day, month, year))
    
    # 이 순서로 append 해서 year, month, day 순서로 정렬
    students.append((year, month, day, name))

students.sort()

print(students[-1][3])
print(students[0][3])
  • 굳이 변수를 날짜 타입으로 접근하지 않고 리스트에 int형으로 생일을 입력받아 sort()하는 방법이 있었다.
  • 결과
  • 연산 시간이 매우 단축되었다. 내 코드에선 날짜 객체로 만들어주는 과정과 나이 계산하는데 시간이 더 소요되었다. 같은 이유로 메모리도 적게 차지한 것 같다.


📌 회고

  • 너무 복잡하게 생각하고 날짜는 날짜 형식으로 계산해야 한다는 생각을 하면서 문제에 고지식하게 접근하는 경향이 있는 것 같다.
  • 파이썬 함수와 그에 적용된 알고리즘에 대해 더 공부하면서 유연한 사고를 할 수 있도록 신경써야 할 것 같다.

0개의 댓글

관련 채용 정보