일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- docker시작하기
- 카카오코테
- 프로그래머스 레벨2
- 도커연결오류
- Cannot connect to the Docker daemon at unix
- 파이썬 양과늑대
- 부스트캠프AITech
- 파이썬
- 네이버 부스트캠프
- 카카오 코딩테스트
- 도커오류
- 파이썬 재귀함수
- 카카오 파이썬
- 파이썬 카카오코딩테스트
- 카카오코딩테스트
- 프로그래머스 레벨3
- 부캠
- 프로그래머스LEVEL1
- 프로그래머스 레벨1
- 프로그래머스 양과늑대
- 양과늑대
- 코딩테스트
- 파이썬 프로그래머스
- level1
- 프로그래머스 파이썬
- 부스트캠프
- 라이브러리란?
- 프레임워크란?
- 프로그래머스
- 부스트캠프 회고
- Today
- Total
코린이의 공부일기
[Python] 프로그래머스 LEVEL2 > 더 맵게 (heap 이용) 본문
안녕하세요 ! 오늘은 오랜만에 프로그래머스 레벨2 문제인 '더 맵게'를 가져왔습니다.
이번 문제는 heap(힙)을 사용하여 푸는 문제로 처음에는 ,, ! 힙을 사용하지 않고 for문을 사용했다가 시간효율성에서 다 실패로 나왔습니다.
그래서 이 문제의 목적을 생각하며 heap(힙)을 사용해 푸니 효율성 통과가 나왔습니다.
프로그래머스에서 많은 문제를 풀어보며 배워가는 점은 많은 함수들과 코딩설계 뿐 아니라 시간복잡도를 줄이려고 하는 능력도 같이 배워가는 거 같습니다.
실제로 코딩테스트를 볼 때 이 부분도 정말정말 중요하니 효율성 체크도 같이하면서 테스트를 보는 것을 추천드립니다.
문제 설명
매운 것을 좋아하는 Leo는 모든 음식의 스코빌 지수를 K 이상으로 만들고 싶습니다. 모든 음식의 스코빌 지수를 K 이상으로 만들기 위해 Leo는 스코빌 지수가 가장 낮은 두 개의 음식을 아래와 같이 특별한 방법으로 섞어 새로운 음식을 만듭니다.
섞은 음식의 스코빌 지수 = 가장 맵지 않은 음식의 스코빌 지수 + (두 번째로 맵지 않은 음식의 스코빌 지수 * 2)
Leo는 모든 음식의 스코빌 지수가 K 이상이 될 때까지 반복하여 섞습니다.
Leo가 가진 음식의 스코빌 지수를 담은 배열 scoville과 원하는 스코빌 지수 K가 주어질 때, 모든 음식의 스코빌 지수를 K 이상으로 만들기 위해 섞어야 하는 최소 횟수를 return 하도록 solution 함수를 작성해주세요.제한 사항
- scoville의 길이는 2 이상 1,000,000 이하입니다.
- K는 0 이상 1,000,000,000 이하입니다.
- scoville의 원소는 각각 0 이상 1,000,000 이하입니다.
- 모든 음식의 스코빌 지수를 K 이상으로 만들 수 없는 경우에는 -1을 return 합니다.
입출력 예
scoville | K | return |
[1, 2, 3, 9, 10, 12] | 7 | 2 |
입출력 예 설명
- 스코빌 지수가 1인 음식과 2인 음식을 섞으면 음식의 스코빌 지수가 아래와 같이 됩니다.
새로운 음식의 스코빌 지수 = 1 + (2 * 2) = 5
가진 음식의 스코빌 지수 = [5, 3, 9, 10, 12] - 스코빌 지수가 3인 음식과 5인 음식을 섞으면 음식의 스코빌 지수가 아래와 같이 됩니다.
새로운 음식의 스코빌 지수 = 3 + (5 * 2) = 13
가진 음식의 스코빌 지수 = [13, 9, 10, 12]
모든 음식의 스코빌 지수가 7 이상이 되었고 이때 섞은 횟수는 2회입니다.
문제 풀이
이 문제는 heap을 사용하여 푸는 문제로 만약 heap을 사용하지 않고 for문 또는 while문과 sort을 사용해 푼다면 거의 시간 초과로 뜰 것입니다.
특히 sort는 시간 복잡도가 좋지 않은 편이기에 쓰지 않는것을 추천드립니다.
저도 이거 처음 풀 때 heap을 모르는 상태여서 for문과 sort을 사용했더니 다 시간초과라고 떴답니다.
문제 자체는 어렵지 않지만 시간복잡도를 고려해야하는 문제로 heap을 공부했다면 꼭 풀기 권장합니다.
import heapq
def solution(scoville, K):
mix=0
heapq.heapify(scoville)
if scoville[0]==K:
return 0
while len(scoville)>=2:
T=heapq.heappop(scoville)+(heapq.heappop(scoville)*2) # #제일 낮은 값
heapq.heappush(scoville,T)
mix+=1
if scoville[0]>=K:
return mix
return -1
코드에서 heap을 쓸 때 꼭 까먹어야하지 말아야할 점! 이 부분을 까먹고 안써서 틀린 분들도 굉장히 많았습니다
heapq.heapify()를 사용해 리스트를 힙(heap)으로 선언해주고 heappop을 해야 최솟값이 나온답니다.
문제 자체는 어렵지 않아 scoville에서의 최솟값이K보다 커질 때까지 두 최솟값을 더해주며 scoville에 push해주는 방식으로 , heap을 써봤다면 금방 풀 수 있는 문제였습니다.
포스팅은 여기까지입니당:)
읽어주셔서 감사합니당 !
잘못된 부분 지적은 환영입니다 ♡
'STUDY > [Python] Coding Test' 카테고리의 다른 글
[Python]LEVEL3- 2022 KAKAO BLIND - 양과 늑대 (0) | 2022.02.08 |
---|---|
[Python] 프로그래머스 LEVEL2> 카카오 코딩테스트 - 메뉴 리뉴얼 (0) | 2021.04.01 |
[Python]프로그래머스 LEVEL2> 카카오 코딩테스트 - 뉴스 클러스터링 (0) | 2021.04.01 |
[Python]프로그래머스 LEVEL2> 카카오 코딩테스트- 오픈채팅방 (0) | 2021.03.30 |
[Python]프로그래머스 LEVEL2>카카오 코딩테스트 - 프렌즈 4블록 (0) | 2021.03.30 |