1. 문제
- 효율성 테스트에 부분점수가 있는 문제 = 효율성 테스트 통과가 관건
- 문제 자체는 이해하기 쉬운 편
2. 풀이
- 효율성 통과를 못할걸 알았지만 일단 대강 짜서 정확성 테스트만 통과했다.
- 효율성 테스트의 경우 k의 값이 이미 1억을 넘기기 때문에 k번 순회하는 것은 안 된다.
- 배열에서 최소값을 찾아내야 하고 적절한 계산 후 pop()으로 빼줘야 하기 때문에 우선순위 큐가 떠오르긴 했다.
- 다만 배열 길이를 줄여가면서 몫과 나머지로 처리하려는 계획이 너무 복잡해서 그냥 구글링을 해봤다.
- 조금 더 고민했으면 풀었을 것 같은데 너무 쉽게 포기한 감이 있다.
- 맨 아래 코드는 구글링 한 코드를 참고하여 작성하였다.
- 주의할 점은 heapq.heappop(heap)의 경우 heap이 비어있으면 IndexError가 발생한다. 이 부분 처리 주의
- prev를 활용하였는데 prev 말고 차감한 시간을 계속 더해줄 변수를 활용하여 푸는 것도 가능하다.
- 핵심은 k를 하나하나가 아닌 뭉탱이로 줄여주는 것.
3. 코드
def solution(food_times, k):
answer = 0
cnt = 0
arr = []
for i, food in enumerate(food_times) :
arr.append([food, i])
while arr :
i = 0
while i < len(arr):
if cnt == k :
return arr[i][1] + 1
arr[i][0] -= 1
cnt += 1
if arr[i][0] == 0:
del arr[i]
else :
i += 1
return -1
효율성 고려, 우선순위 큐 활용
import heapq
def solution(food_times, k):
answer = 0
cnt = 0
arr = []
for i, food in enumerate(food_times) :
arr.append([food, i])
heapq.heapify(arr)
min_time = arr[0][0]
prev = 0
while k - (min_time - prev) * len(arr) >= 0 :
k -= (min_time - prev) * len(arr)
prev= heapq.heappop(arr)[0]
if not arr :
return -1
min_time = arr[0][0]
arr.sort(key = lambda x : x[1])
return arr[k % len(arr)][1] + 1
'알고리즘 > 프로그래머스' 카테고리의 다른 글
2019 KAKAO BLIND - 매칭 점수(파이썬, 정규표현식 없이) (0) | 2021.03.02 |
---|---|
2019 KAKAO BLIND RECRUITMENT- 길 찾기 게임, 파이썬 (0) | 2021.02.26 |
2019 KAKAO BLIND RECRUITMENT- 후보키, 파이썬 (0) | 2021.02.25 |
2019 카카오 코딩테스트 기출 - 실패율 , 파이썬 (0) | 2021.02.24 |
2019 KAKAO BLIND RECRUITMENT - 오픈채팅방, 파이썬 (0) | 2021.02.23 |