오늘은 정렬 알고리즘이 필요한 백준 5635번 문제, 생일을 풀어보겠습니다!
< 문제 확인 >
https://www.acmicpc.net/problem/5635
📌 문제 탐색하기
- 문제에서 구해야 하는 최종 정답은 무엇인지 탐색한 과정
- 그 정답을 구하기 위해 어떻게 코드를 구현해야 할지 고민한 과정
- 문제에 들어오는 범위를 파악하며 어떤 알고리즘을 쓸 수 있을지 고민해 가는 과정
어떤 반에 있는 학생들의 생일이 주어졌을 때,
가장 나이가 적은 사람과 가장 많은 사람을 구하는 프로그램을 작성
이 문제에서 체크할 포인트는 3가지가 있다.
첫 번째로는, 생일 일, 월, 연을 순서대로 입력받는데 태어난 해가 같은 경우
생일이 가장 빠르면 나이가 더 많고, 생일이 늦으면 나이가 더 적다고 판단하는 것이다.
두 번째로는, 단어 정렬(백준 1181번) 문제처럼 입력받은 생일 데이터를 튜플로 저장하고
sorted()함수를 통해 리스트로 변환 후 처리하는 것이다.
마지막으로는, 생일 기준으로 학생들을 정렬해야하므로
연도, 월, 일을 차례대로 비교할 수 있도록 정렬 키를 설정한다.
그리고 이번에도 함수를 선언해서 시도해보기로했다!
✔️ 가능한 시간복잡도
입력할 수 있는 학생수는 최대 100명이므로
O(NlogN) 시간 복잡도를 가지는 정렬 알고리즘을 사용해도 충분하다.
✔️ 알고리즘
입력받은 데이터들을 리스트로 변환하여 정렬하고, 기준은 (연도, 월, 일)로 설정한다.
sorted() 함수를 사용하여 집합을 정렬하면 자동으로 리스트로 변환된다!
📌 코드 설계하기
- 문제 탐색하기 과정을 기반으로 이 문제를 해결하기 위한 로드맵을 그리는 과정
- 어떤 순서로 코드를 작성해야 할지, 어떤 함수들을 작성해야 할지 등을 작성
1. 학생의 수인 N을 입력한다.
2. 각 학생의 이름과 생일을 입력받고 이를 튜플 (이름, 연도, 월, 일)로 저장한다.
3. 생일을 기준으로 학생 리스트를 정렬한다. # 연도, 월, 일
4. 정렬된 리스트에서 아래 2명의 이름을 출력한다.
첫 번째 요소의 이름 (가장 나이가 많은 사람)
마지막 요소의 이름 (가장 나이가 적은 사람)
📌 시도 회차 수정 사항 (Optional)
무문별하게 “맞았습니다”가 나올때 까지 수정하는 형태의 문제 풀이를 반복하면,
내가 어떤 실수를 해서 해당 문제를 틀렸는지 모른다.
- 틀렸습니다를 받았다면 왜 틀렸는지, 어떻게 수정할 수 있는지 고민하는 과정을 작성
- 위에 내가 세울 설계에서 어떤 부분이 틀렸는지도 함께 점검
📌 정답 코드
def main():
n = int(input())
students = []
for _ in range(n):
name, dd, mm, yyyy = input().split()
dd, mm, yyyy = int(dd), int(mm), int(yyyy)
students.append((name, yyyy, mm, dd))
# 생일을 기준으로 정렬
students.sort(key=lambda x: (x[1], x[2], x[3])) # 연도, 월, 일
print(students[-1][0]) # 가장 나이가 적은 사람
print(students[0][0])# 가장 나이가 많은 사람
if __name__ == "__main__":
main()
정렬과 관련된 여러가지 대표 문제를 4일동안 풀어보았습니다!
2309번 일곱난쟁이
10814번 나이순 정렬
1181번 단어 정렬
5635번 생일
여러분들도 위 4가지 문제를 풀어보며 정렬 알고리즘을 마스터하세요 :)
코테 챌린지 3기 파이팅 :)
@why_dev_says_no
'개발공부 > BAEKJOON' 카테고리의 다른 글
[백준 / python] 2947번 나무 조각 (0) | 2024.08.10 |
---|---|
[백준 / python] 25305번 커트라인 (0) | 2024.08.09 |
[백준 / python] 1181번 단어 정렬 (0) | 2024.08.07 |
[백준 / python] 10814번 나이순 정렬 (0) | 2024.08.06 |
[백준 / python] 2309번 일곱난쟁이 (0) | 2024.08.05 |