study/Programmers
[Python] 더 맵게
bbooo
2024. 5. 25. 03:30
728x90
https://school.programmers.co.kr/learn/courses/30/lessons/42626
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
접근법
- K 미만의 값을 반복해서 찾아야 함.
-> 첫번째 값으로 최소값을 보장하는 heapq 모듈을 사용하여 우선순위큐를 활용. - 반복해서 0번째 index의 값을 뽑아서 K 보다 작은지 확인을 한 후 K보다 작다면 새 스코빌 지수를 작성하여 heap에 push함.
- 이를 0번째 index의 값이 K보다 크거나, 힙의 길이가 2초과일때까지만 반복함.
import heapq
def solution(scoville, K):
answer = 0
heapq.heapify(scoville)
while scoville[0] < K:
if len(scoville) < 2:
return -1
first_sc = heapq.heappop(scoville)
second_sc = heapq.heappop(scoville)
new_sc = first_sc + second_sc * 2
heapq.heappush(scoville, new_sc)
answer += 1
return answer
처음 생각했던 알고리즘의 문제점(틀린이유)
더보기
리스트를 정렬한 후 순서대로 pop을 해서 K보다 작은지 확인한 후 새 스코빌 지수를 append하고자 했음.
pop을 활용하기 때문에 시간복잡도를 고려하여 내림차순으로 정렬한 후 -1번째부터 pop을 하고자함.
다만 이 방법을 활용한다면 새 스코빌 지수가 append 된 후 순서를 보장할 수 없기 때문에 에러가 발생했다.
def solution(scoville, K):
answer = 0
scoville.sort(reverse = True)
while scoville[-1] < K:
if len(scoville) < 2:
return -1
first_sc = scoville.pop()
second_sc = scoville.pop()
new_sc = first_sc + second_sc * 2
scoville.append(new_sc)
answer += 1
return answer
사용된 알고리즘
힙(heapq)
728x90