https://programmers.co.kr/learn/courses/30/lessons/42626
코딩테스트 연습 - 더 맵게
매운 것을 좋아하는 Leo는 모든 음식의 스코빌 지수를 K 이상으로 만들고 싶습니다. 모든 음식의 스코빌 지수를 K 이상으로 만들기 위해 Leo는 스코빌 지수가 가장 낮은 두 개의 음식을 아래와 같
programmers.co.kr

풀이
문제를 보았을때 알수있는 힌트
단순하게 생각하면 정렬을 하고 최소 값 두개를 뽑아서 조건에 맞는 식을 다시 집어넣고 정렬하고 하면 문제는 풀수있다.
# 단순하게 리스트로 풀었을 경우
def solution(scoville, K):
answer =0
count=0
scoville.sort()
while scoville[0]<K :
if len(scoville)<2:
count=-1
break
v1=scoville.pop(0)
v2=scoville.pop(0)
temp = v1+(v2*2)
scoville.append(temp)
scoville.sort()
count+=1
answer = count
return answer
이렇게 푼다면 정확성은 100%로 이상없었지만 효율성은 시간 초과가 난다.
scoville의 최대가 10의 6승인데 그것을 계속 정렬을 하고있기 때문에 엄청난 시간이 소요된다.
이럴때는 O(nlogn) 인 힙큐를 이용하여 문제를 풀면 효율성을 해결 할 수 있다.
import heapq
def solution(scoville, K):
h = []
count=0
# 처음 우선 순위 큐에 집어 넣기
for i in scoville:
heapq.heappush(h,i)
# 최소가 K 이상 이 나올 때까지 돌린다.
while h[0]<K :
# 우선순위큐의 리스트가 2보다 작은 경우 -1로 출력
if len(h)<2:
count=-1
break
# 최소인 힙을 두개 꺼낸다.
v1= heapq.heappop(h)
v2= heapq.heappop(h)
# 최소인 두개의 값을 조건에 맞게 섞는다
temp = v1+(v2*2)
# 섞은 값을 다시 우선순위 큐에 집어 넣는다.
heapq.heappush(h,temp)
count+=1
answer = count
return answer

https://github.com/dydwkd486/coding_test/blob/main/programmers/더%20맵게.py
GitHub - dydwkd486/coding_test: 코딩테스트 공부한 내용 정리
코딩테스트 공부한 내용 정리. Contribute to dydwkd486/coding_test development by creating an account on GitHub.
github.com
'Coding Test > programmers' 카테고리의 다른 글
[프로그래머스] 이중우선순위큐 - python (레벨 3) (0) | 2022.06.15 |
---|---|
[프로그래머스] 디스크 컨트롤러- python (레벨 3) (0) | 2022.06.05 |
[프로그래머스] 등굣길 - python (레벨 3) (0) | 2022.05.29 |
[프로그래머스] 정수 삼각형 - python (레벨 3) (0) | 2022.05.13 |
[프로그래머스] 가장 큰 정사각형 찾기 - python (레벨 2) (0) | 2022.05.13 |