본문 바로가기

백준 write-up/정렬 & 그리디

[백준] 팬덤이 넘쳐흘러 : 17262번 - Python

728x90
반응형

https://www.acmicpc.net/problem/17262

 

17262번: 팬덤이 넘쳐흘러

선물 포장 공장을 말아먹은 욱제는 계곡에서 백숙을 파느라 학교에 자주 가지 못한다. 하지만 월클의 인생은 피곤한 법! 욱제는 지금처럼 힘든 시기에도 자신을 기다리는 5조5억명의 열렬한 팬

www.acmicpc.net

 

 

 

문제의 접근 방법

 

- 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])
728x90
반응형