https://www.acmicpc.net/problem/5635
난이도:
▶ 문제 탐색하기
n : 학생의 수 (1 ≤ N ≤ 100)
이름 dd mm yyyy : 단어들 (알파벳 소문자, len(이름) ≤ 15, 1990 ≤ yyyy ≤ 2010, 1 ≤ mm ≤ 12, 1 ≤ dd ≤ 31), 중복 x
◇ 원하는 출력 조건
- 막내의 이름
- 첫째의 이름
▶ 코드 설계하기
먼저 2차원 배열에 학생의 정보를 담은 후, arr[n][3]의 값의 최대, 최소를 찾는다.
만약, 중복된다면 arr[n][2]를 비교하고 또 중복된다면 arr[n][1]을 비교하여 max, min을 찾는다.
고민: 한 번에 2차원 배열을 입력 받은 후에 비교 연산을 진행할지, 한 줄 한 줄 입력받으며 비교 연산을 진행할지 고민이다. 이론 상으로는 후자가 더 적은 연산을 갖을 것이다.
1. 학생 수를 입력받는다.
2. 한 줄씩 입력받아 2차원 배열로 저장한다.
3. arr[i][3]의 max를 막내, min을 첫째라고 하자
4. 만약 arr[i][3]의 max/min이 2개 이상이라면, arr[i][2]에서 max/min을 각각 찾는다.
5. 만약 arr[i][2]의 max/min이 2개 이상이라면, arr[i][1]에서 max/min을 각각 찾는다.
6. max와 min에 해당하는 arr[i][0]을 읽는다.
idea1. 한 번에 max와 min을 찾을까, 아니면 나눠서 찾을까?
idea2. 만약 막내/첫째의 년도가 1999라면 1999가 아닌 모든 행은 지워버린다. -> 꼭 지우는 단계가 필요한가? -> ㄴㄴ
▶ 회차별 수정사항
- 여튼 아래처럼 하나하나씩 비교하다가 else 구문에 여러 경우의 수를 고려해야함을 알고 빠르게 포기.
- arr[i][3]의 min과 max를 구하려면 list comprehension을 사용해야한다.
그게뭐지..?
▶ 정답 코드
import sys
N = int(sys.stdin.readline())
arr = []
for _ in range(N):
name, day, month, year = sys.stdin.readline().split()
arr.append([name, int(year), int(month), int(day)])
arr.sort(key=lambda x: (x[0], x[1], x[2]))
print(arr[n-1][0])
print(arr[0][0])
▶ 추가 풀이
'코딩테스트 > BOJ' 카테고리의 다른 글
[백준] 2578번: 빙고 (0) | 2024.07.01 |
---|---|
[백준] 25305번: 커트라인 (0) | 2024.06.28 |
[백준] 1181번: 단어 정렬 (0) | 2024.06.26 |
[백준] 10814번: 나이순 정렬 (0) | 2024.06.25 |
[백준] 2309번: 일곱 난쟁이 (0) | 2024.06.24 |