Coding Test/programmers
[Python] 파이썬 프로그래머스 더 맵게
파송송
2022. 9. 5. 15:27
728x90
https://school.programmers.co.kr/learn/courses/30/lessons/42626
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
heap 구조 이해할 겸 구현하여 풀었으나 효율성에서 떨어짐
https://pasongsong.tistory.com/146?category=1026284
[자료구조] 힙 Heap
Heap 데이터에서 최대값과 최소값을 빠르게 찾기 위해 고안된 Complete Binary Tree 완전 이진 트리 Complete Binary Tree node 삽입시 최하단 왼쪽 node부터 차례대로 삽입하는 Tree 사용하는 이유 배열의 최대
pasongsong.tistory.com
def solution(scoville, K):
scoville = scoville
scoville.sort()
scoville.insert(0, None)
cnt = 0
try:
while scoville[1] < K :
if len(scoville) == 2:
return -1
first = pop(scoville)
second = pop(scoville)
sco_insert(scoville, first + second * 2)
cnt += 1
except:
return -1
return cnt
def pop(scoville):
popped_val = scoville[1]
inserted_val = scoville[-1]
del scoville[-1]
sco_down(scoville, inserted_val)
return popped_val
def sco_down(scoville, insert_val):
idx = 1
compare_idx = 0
while idx < len(scoville):
if compare_idx == idx :
break
compare_idx = idx
# pop에서 [1] 자리를 None으로 비워놓을 것임
scoville[idx] = insert_val
#idx
left_idx = idx * 2
right_idx = idx * 2 + 1
# Not exist child node
if left_idx >= len(scoville):
pass
# Not right child node
elif right_idx >= len(scoville):
if scoville[idx] > scoville[left_idx]:
scoville[idx], scoville[left_idx] = scoville[left_idx], scoville[idx]
idx += left_idx
else:
pass
# exist both node
else:
if scoville[left_idx] <= scoville[right_idx] and scoville[idx] > scoville[left_idx]:
scoville[idx], scoville[left_idx] = scoville[left_idx], scoville[idx]
idx = left_idx
elif scoville[left_idx] > scoville[right_idx] and scoville[idx] > scoville[right_idx]:
scoville[idx], scoville[right_idx] = scoville[right_idx], scoville[idx]
idx = right_idx
return scoville
def sco_insert(scoville,inserted_val):
scoville.append(inserted_val)
inserted_idx = len(scoville)-1
while True:
if sco_up(scoville,inserted_idx) == False:
break
else:
parent_idx = inserted_idx // 2
scoville[inserted_idx], scoville[parent_idx] = scoville[parent_idx], scoville[inserted_idx]
inserted_idx = parent_idx
return scoville
def sco_up(scoville, inserted_idx):
if inserted_idx <= 1:
return False
parent_idx = inserted_idx // 2
if scoville[inserted_idx] < scoville[parent_idx]:
return True
else:
return False
파이썬의 heapq를 사용하여 문제 해결
https://pasongsong.tistory.com/153
[Python] heapq 라이브러리 사용하기
[5, 9, 7, 1, 2, 5, 6, 3] [1, 2, 5, 3, 5, 7, 6, 9] heapq binary tree 기반의 min heap을 제공함 import heapq 초기화 빈 list에 heapq 라이브러리를 사용하여 heap 구현 heap = [] 추가 heappush(heap, value)..
pasongsong.tistory.com
import heapq
def solution1(scoville, K):
heapq.heapify(scoville)
count = 0
while scoville:
first = heapq.heappop(scoville)
if first >= K:
return count
if not scoville:
break
second = heapq.heappop(scoville)
heapq.heappush(scoville, first + second * 2)
count += 1
return -1
728x90