다라다라V
article thumbnail
728x90
반응형

1. 문제요약 (2343번. 기타 레슨)

 

 

 

2343번: 기타 레슨

강토는 자신의 기타 강의 동영상을 블루레이로 만들어 판매하려고 한다. 블루레이에는 총 N개의 강의가 들어가는데, 블루레이를 녹화할 때, 강의의 순서가 바뀌면 안 된다. 순서가 뒤바뀌는 경

www.acmicpc.net

 

 

2. 풀이를 위한 부연 설명

  • 블루레이 크기가 모두 같고, 녹화 순서가 바뀌지 않아야한다를 통해 이진 탐색임을 알아야함
    • 강의 순서대로 차례로 저장하면서 해당하는 크기의 블루레이로 모든 강의가 저장되는지 확인하는 방식
    • 가능하다면 블루레이의 크기를 줄이고, 불가능하다면 블루레이의  크기를 늘임.
  • 이진 탐색의 시작은 레슨의 가장 큰 강의 길이로 하여 각각 담는 경우와
  • 끝은 모든 강의의 합으로 하여 모든 강의를 한 번에 담는 경우를 고려
  • 해당하는 크기로 모든 강의를 담을 수 있는지 확인하는 것이 포인트!

 

3. 코드

<python />
import sys input = sys.stdin.readline n, m = map(int, input().split()) times = list(map(int, input().split())) start = max(times) end = sum(times) while start <= end: mid = (start + end) // 2 tmp = 0 cnt = 0 for t in times: if tmp + t > mid: cnt += 1 tmp = 0 tmp += t if tmp != 0: cnt += 1 if cnt > m: start = mid + 1 else: end = mid - 1 print(start)

 

3.1. 주석 상세 설명 ver.

<python />
import sys input = sys.stdin.readline n, m = map(int, input().split()) times = list(map(int, input().split())) # start = 리스트 중 최댓값, end = 리스트의 총합 start = max(times) end = sum(times) while start <= end: mid = (start + end) // 2 tmp = 0 cnt = 0 # 각 강의가 새 블루레이에 담아야하는지, # 기존 블루레이에 이어서 저장하는지 확인 for t in times: # 만약 새 블루레이 써야하는 경우 # (= 해당 하는 강의를 넣으면 블루레이 용량보다 커지는 경우) if tmp + t > mid: cnt += 1 tmp = 0 # 현재 블루레이에 강의 넣기 tmp += t # 만약 넣어야하는 강의가 남은 경우, 새 블루레이에 나머지 담기 if tmp != 0: cnt += 1 # 이진탐색 수행 if cnt > m: start = mid + 1 else: end = mid - 1 print(start)

 

4. 기억할 점

  • 이진 탐색 문제라는 것을 알아봐야하는 문제
  • 블루레이에 강의를 넣을 수 있는지 판단하는 것이 중요한 아이디어
<python />
for t in times: # 만약 새 블루레이 써야하는 경우 # (= 해당 하는 강의를 넣으면 블루레이 용량보다 커지는 경우) if tmp + t > mid: cnt += 1 tmp = 0 # 현재 블루레이에 강의 넣기 tmp += t

 

  • 이분 탐색 후 답이 무엇인지 알아야함

 

반응형
profile

다라다라V

@DaraDaraV

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!