티스토리 뷰
프로그래머스의 힙의 첫번째 문제입니다.
programmers.co.kr/learn/courses/30/lessons/42626?language=python3
문제는 굉장히 간단합니다.
매운음식을 굉장히 사랑하는 매운음식 성애자가 있고,
모든 음식의 매운 정도가 스코빌 지수라는 값으로 있다고 가정합니다.
이때 가장 안매운 음식이 K이상의 스코빌 지수가 되길 원하는 상태입니다.
만약 안매운 음식이 K이하의 스코빌을 갖는다면
Mix음식 = 가장 안매운 음식의 스코빌 + 2번째로 안매운 음식의 스코빌*2
의 Mix 음식으로 재탄생 되게 됩니다.
알고리즘은 간단합니다.
1. 요리의 Min값을 도출한다.
2. 해당 요리의 스코빌을 K와 비교한다.
2_1 K보다 크면 알고리즘 종료
3. K보다 작으면 Min값을 한번더 도출
4. Mix음식을 생성 후 요리 List에 Add
5. 1~4반복
위 방법을 일반적인 정렬 알고리즘으로 가능합니다.
하지만 정렬 알고리즘은 최소 nlogn(Count기반 정렬 제외)의 시간복잡도를 보여주기 때문에
해당 문제를 Sort로 해결하는 것은 매우 비효율적인 상황이 됩니다.
이때 Cool Way(쉬운길)로는 Python의 List의 Min, Pop을 사용하는 방법이 있습니다.
def solution(scoville, K):
#가장 안매운 음식의 스코빌이 K이상일때까지 Mix횟수
answer = 0
init_len = len(scoville)
#가장 안매운 음식의 스코빌이 K상이거나, 남은 음식이 하나일경우 알고리즘 종료
#하나인경우 종료하는 이유는 이전에 Mix된 음식의 스코빌이 K이하인것을 확인하고
#다시 List에 들어온 음식이기 때문입니다.
while min(scoville)<K and len(scoville)!=1:
#가장 안매운 + 2번째로 안매운 음식의 스코빌을 추출하여
#Mix음식을 만들고, Mix 음식의 스코빌을 다시 음식 List에 넣습니다
scoville.append(scoville.pop(scoville.index(min(scoville)))+scoville.pop(scoville.index(min(scoville)))*2)
answer += 1
#while 문 내의 반복문을 줄이기 위한 방법이며
#반복문 완료 후에도 가장 안매운 음식이 K이하이면
#목표에 도달하지 못한 것이므로, Answer를 -1로 치환함
if min(scoville)<K:
answer = -1
return answer
하지만 위 방법을 사용할 경우 효율성에서 시간 초과로 통과가 불가능합니다.
이때 Heap을 사용하면 빠른 답을 찾을수있을 것이란것을 알 수 있습니다.
Heap같은 경우 Max or Min값을 찾고 다시 List를 정렬하는데 logn의 시간복잡도를 보여줍니다.
teus-kiwiee.tistory.com/18?category=913859
Min, Max 모두 n의 시간복잡도를 보인다는것을 생각하면,
Heap을 사용하면 빠른 시간안에 결과를 도출할 수 있을것으로 예상됩니다.
'코딩테스트 > 프로그래머스' 카테고리의 다른 글
멀쩡한 사각형 (0) | 2021.03.04 |
---|---|
프린터 대기열 문제 (0) | 2021.03.03 |
2xn 타일링 (0) | 2021.03.02 |
Sort - H-Index (0) | 2021.03.01 |
스택 - 다리건너기 문제 (0) | 2021.02.25 |
- Total
- Today
- Yesterday
- heap
- 코딩테스트
- Greedy알고리즘
- GDC
- 알고리즘
- AVX
- 병렬처리
- 사칙연산
- 컴퓨터그래픽스
- 프로그래머스
- 이분탐색
- 완전탐색 알고리즘
- C++
- Sort알고리즘
- Search알고리즘
- 자료구조
- Python
- 동적계획법
- stack
- SIMD
- prime number
- git
- 분할정복
- hash
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 29 | 30 |