https://www.acmicpc.net/problem/17262
문제의 접근 방법
- N명의 팬들이 머무는 시간을 의미하는 입력 값 s,e 중에서 가장 큰 값(max)에서 가장 작은 값(min)을 빼면 욱제가 학교에 머물러야 할 시간을 구할 수 있음.
여기서 가장 큰 값은 제일 늦게 등교한 학생을 의미하고, 가장 작은 값은 제일 빨리 하교한 학생을 의미한다!
- 팬들이 머무르는 시간이 모두 겹치면(=위의 계산 결과 값이 음수이면) 욱제가 학교에 머물러야 할 시간은 0이다.
내가 막혔던 부분
- 팬들이 등하교한 시간이 겹치는 여부에 따라 욱제가 학교에 머물러야 할 시간이 계산된다는 것을 알아냈지만 이를 수식화 하는 것에서 막힘.
문제 풀이 방법
(1) 팬의 수 N명 입력받기
(2) N명의 팬들이 등교한 시간(s), 하교한 시간(e) 입력받아서 리스트 time에 2차원 배열로 저장하기
(3) 팬들의 등하교 시간이 담겨있는 리스트 time을 s값을 기준으로 내림차순 정렬하기
(여기서 내림차순으로 정렬하는 이유는 가장 늦게 등교한 학생의 시간을 찾아야 하기 때문)
(4) 또, 람다함수를 이용하여 리스트 time을 e값을 기준으로 오름차순 정렬하기
(가장 빨리 하교한 학생의 시간을 찾기 위해)
(5) 만약 (가장 늦게 등교한 학생 - 가장 빨리 하교한 학생) 이 0보다 작다면 욱제가 학교에 있는 동안 모든 팬들을 만났다는 뜻이므로 0 출력
(6) (5)가 아니라면 그 차이만큼 욱제가 학교에 머물러야 한다는 뜻이므로 해당하는 값을 출력하기!
소스코드
N = int(input()) # 팬의 수
time = [list(map(int, input().split())) for _ in range(N)] # N개의 줄에 걸쳐 s,e 입력받기
s = sorted(time, reverse=True) # s값을 기준으로 정렬
e = sorted(time, key=lambda x:x[1]) # e값을 기준으로 정렬
# 가장 늦게 등교한 학생 - 가장 빨리 하교한 학생
if (s[0][0]-e[0][1]) < 0:
print(0) # 0보다 작다는건 욱제가 학교에 머물러야 할 시간이 없다는 뜻!
else:
print(s[0][0]-e[0][1])
'백준 write-up > 정렬 & 그리디' 카테고리의 다른 글
[백준] 책 정리 : 1434번 - Python (0) | 2021.09.06 |
---|---|
[백준] 모두의 마블 : 12845번 - Python (0) | 2021.09.03 |
[백준] 욱제는 도박쟁이야!! : 14655번 - Python (0) | 2021.08.26 |
[백준] 동전 뒤집기 : 1285번 - Python (0) | 2021.08.25 |
[백준] 토너먼트 만들기 : 2262번 - Python (0) | 2021.08.21 |