-
프로그래머스_level2_디펜스 게임 (python)Algorithm/프로그래머스_생각정리 2023. 7. 27. 13:54
★ 접근
모든 경우의 수를 살펴봐야하고, 엄청난 크기의 병사, 최대 백만인 라운드 수 이 요소들을 종합적으로 미루어 봤을 때 그리디 알고리즘을 떠올릴 수 있다. 근데 여기서 그리디만을 가지고는 풀 수 없다. 그리디인데도 불구하고 시간초과가 날 것이다. 우선순위 큐 알고리즘도 접목시켜야 풀 수 있다.
★ 풀이
매번 라운드 적군과 맞서 싸운다. 그러다가 아군 병사의 숫자가 적군의 병사의 숫자보다 부족할 경우 무적권을 써야한다.
이 때 무적권이 한 장도 남지 않았다면 게임을 종료시킨다.
무적권이 남아있다면 음수가 돼도 괜찮으니 현재 남은 아군 병사에 현 라운드 적군 병사의 숫자만큼 뺀다. 그리고 현재 적군 숫자를 우선순위 큐에 넣은다음 이제까지 치뤘던 전투 중 가장 적군이 많았던 숫자를 꺼낸 다음 현재 병사에 더해준다.
★ 코드
import heapq def solution(n, k, enemys): answer = 0 q = [] for enemy in enemys: if n >= enemy: n -= enemy heapq.heappush(q, -enemy) else: if k < 1: break else: n -= enemy k -= 1 heapq.heappush(q, -enemy) num = -heapq.heappop(q) n += num answer += 1 return answer
★ 회고
처음에 그리디 문제인 것을 바로 떠올렸지만 시간초고가 나지 않게 어떻게 할 것인지 떠올리기 힘들었다. 문제를 풀다가 든 생각이지만 만약 게임을 클리어할 수 있다고 했을 때 병사의 수를 최대한 많이 남겨야 한다는 조건이 붙었을 때 어떻게 풀어야지 생각을 해봤는데 위 풀이랑 로직이 똑같을 것이다. 위 로직도 최대한 적군이 많았을 때 무적권을 사용하기 때문이다.
'Algorithm > 프로그래머스_생각정리' 카테고리의 다른 글
프로그래머스_연속된 부분 수열의 합(python) (0) 2023.04.10 프로그래머스_과제 진행하기(python) (0) 2023.04.02 프로그래머스_광물캐기_level2(python) (0) 2023.03.26 프로그래머스_두 큐 합 같게 만들기_level2(python) (0) 2023.03.23 프로그래머스_level 2_리코쳇 로봇(python) (0) 2023.03.19