이 포스팅은 프로그래머스 시리즈 28 편 중 24 번째 글 입니다.

  • Part 1 - 01: 다리를 지나는 트럭
  • Part 2 - 02: 멀정한 사각형
  • Part 3 - 03: 더 맵게
  • Part 4 - 04: 메뉴 리뉴얼
  • Part 5 - 05: 전화번호 목록
  • Part 6 - 06: 가장 큰 수
  • Part 7 - 07: 예상 대진표
  • Part 8 - 08: 다단계 칫솔 판매
  • Part 9 - 09: 불량 사용자
  • Part 10 - 10: 베스트 앨범
  • Part 11 - 11: 합승 택시 요금
  • Part 12 - 12: 스타 수열
  • Part 13 - 13: 위장
  • Part 14 - 14: 주식 가격
  • Part 15 - 15: 디스크 컨트롤러
  • Part 16 - 16: N으로 표현
  • Part 17 - 17: 전화번호 목록
  • Part 18 - 18: 단어 변환
  • Part 19 - 19: 여행 경로
  • Part 20 - 20: 프린터
  • Part 21 - 21: 후보키
  • Part 22 - 22: 삼각 달팽이
  • Part 23 - 23: 실패율
  • Part 24 - This Post
  • Part 25 - 26: 기둥과 보 설치
  • Part 26 - 27: 광고 삽입
  • Part 27 - 28: 퍼즐 조각 채우기
  • Part 28 - 29: 상호 평가
▼ 목록 보기

목차

▼ 내리기

풀이

일단 input보고 항상 판단하는 것이 중요하다. 방향만 잘 잡으면 어느정도 풀 수 있다. 이제.

이분 탐색의 핵심은 결국 값을 제안하고, 그 값이 맞는지 틀린지를 검증하는 로직을 찾을 수 있냐는 것이다. 이 부분에서 고민을 좀 많이 했는데, 입출력 예가 너무 나를 혼란스럽게 했다.

그냥 숫자만 딱 보고 생각하면, 가장 작은 시간을 소요하는 심사관한테 모든 사람을 다 때려넣어본다. 그러면 제안한 시간에 대해 이사람이 처리할 수 있는 사람의 상한이 나오는데, 그걸 기준으로 생각한다.

예를 들어 100분동안 처리할거야! 라고 제안했는데, 7분 걸리는 심사관은 그 시간동안 처리할 수 있는 사람의 수가 14명인 것. 그러면 이 사람보다 시간이 많이 걸리는 사람의 경우 이것보다 적은 사람을 처리하게 된다.

이렇게 간단하게 생각하면 문제가 풀린당.

Code

def solution(n, times):
    
    def isOk(value):
        numOfPerson = 0
        i = 0
        while numOfPerson <= n and i < len(times):
            numOfPerson += (value//times[i])
            i += 1
    
        if numOfPerson >= n: return True
        else: return False
    
    times.sort()
    left, right = 1, times[-1]*n
    while left < right :
        
        mid = (left+right)//2
        if isOk(mid): 
            right = mid
        else: # 제안한 값이 넘치는 경우 10 > 6
            left = mid+1
    
    return right

Reference