https://school.programmers.co.kr/learn/courses/30/lessons/42626
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
전체 코드
from heapq import *
def solution(scoville, K):
answer = 0
heapify(scoville)
while(scoville[0]<K):
if len(scoville) < 2:
return -1
heappush(scoville,mixScov(heappop(scoville),heappop(scoville)))
answer +=1
return answer
def mixScov(first,second):
return first+(second*2)
알고리즘 설명
heap queue를 사용하여서 문제를 해결하였다.
heap?
heap이란, 완전 이진트리의 일종으로 우선순위 큐를 위하여 만들어진 자료구조다. 여러 값들 중 최대/최솟값을 빠르게 찾아낼 수 있다.
이 문제에서는, min heap을 사용하였다.
min heap은 부모 노드의 키 값이 자식 노드의 키 값보다 작거나 같은 완전 이진트리이다.
min heap을 사용하면 원소들이 항상 정렬된 상태로 추가 및 삭제된다. 그리고, 가장 작은 값은 언제나 0번 인덱스에 위치한다.
Python의 heapq 모듈을 import 하여 heap 자료구조를 사용할 수 있다.
일반적인 list를 heap queue로 변환하기 위한 함수 : heapify(list_name)
heap에서 원소를 추가하기 위한 함수 : heappush(list_name, value)
heap에서 원소를 삭제하기 위한 함수 : heappop(list_name)
코드 설명
scoville 지수를 섞은 후, 결괏값이 최솟값보다 작은지, 큰지 알 수 없다. 따라서 내부적으로 정렬을 해 줄 수 있는 heap 자료구조를 사용하였다.
기존의 scoville List를 heap queue로 변환하였다. 기본적으로 Python에서 제공하는 heapq 모듈을 사용하면 min heap을 기준으로 기능을 제공한다. min heap에서 index 0번째가 최솟값이기 때문에, 최소값이 K 이상이 될 때까지 while문을 통해 while 문 내부의 코드를 반복한다.
만약, scoville heap queue의 길이가 2 미만이라면, item을 섞을 수 없기 때문에 -1을 return 한다. 왜냐하면 while문을 탈출하지 못했다는 것은 scoville heap queue 내부 요소의 최솟값이 K 미만이라는 뜻인데, 더 이상 item을 섞을 수 없는 상황이기 때문이다.
scoville heap queue의 길이가 2 이상이라면, 최솟값과 그다음 작은 값(heap queue에서 index 0,1번)을 섞어서 결괏값을 scoville heap queue에 push한다. push하게 되면, 내부적으로 정렬하여 결과값을 알맞은 자리에 위치시킨다. 그 후, answer를 1 증가시킨다.
'알고리즘(Python)' 카테고리의 다른 글
[프로그래머스 LV.2] 피보나치 수 (2) | 2023.11.22 |
---|---|
[프로그래머스 LV.2] 다음 큰 숫자 (2) | 2023.11.22 |
알골 3번(Python) - 최소공배수, 최대공약수 구하기 (백준 2609번) (0) | 2021.09.04 |
알골 2번(Python) - OX 퀴즈(백준 8958번) (0) | 2021.08.29 |
알골 1번(Python) - 선택 정렬 & 이진 검색 (0) | 2021.08.23 |