티스토리 뷰
반응형
📘 프로그래머스 디펜스 게임 python
✅ 문제 요약
n
명 병사로 적의 공격을 순서대로 막아야 함- 매 라운드마다 적
enemy[i]
명이 등장함 - 병사로 막으면
n -= enemy[i]
- 병사가 부족하면 무적권을 써서 병사 소모 없이 막을 수 있음
- 무적권은
k
번만 사용 가능 - 게임오버 조건: 병사도 없고, 무적권도 없고, 막아야 할 적이 있음
🎯 목표
무적권을 적절히 사용해서 가능한 많은 라운드를 버텨야 한다.
🔍 핵심 아이디어 요약
"병사가 모자라는 순간, 지금까지 막았던 적 중 가장 큰 enemy[i]에 무적권을 소급 적용해 게임오버를 피한다."
🧠 왜 이 방식이 정답을 보장하는가?
💡 병사는 계속 줄어들지만, 무적권은 유한하므로 아껴 써야 함
- 병사는 매 라운드
enemy[i]
만큼 줄어듭니다. - 무적권은 정해진 횟수(k)만 사용할 수 있습니다.
- 따라서 무적권은 가장 효과가 클 때 사용해야 합니다.
💡 무적권은 "소급 적용"해야 이득
- 예를 들어 병사가
n = 10
, 무적권k = 1
, 적 리스트가[4, 3, 6]
이라고 하면:
- 이때 무적권이 하나 있다면? → 1, 2, 3 중 가장 적 수가 많은 3라운드가 아니라 → 지금까지 막은 라운드 중 가장 큰 수(=6)를 무적권으로 되돌려야 한다.
- 즉, 3라운드를 병사로 막고
n < 0
이 되면, → 무적권 1개를 써서 **가장 많은 병사가 소모된 라운드(6)**를 **무적권으로 치환** → 그 병사 수만큼n
을 복구할 수 있다.
💾 heapq를 사용하는 이유
- 지금까지 막은 적들 중
enemy[i]
가 가장 큰 값을 빨리 찾아야 함. heapq
는 Python의 **우선순위 큐(min-heap)**로 가장 작은 값이 먼저 나옴 → 음수를 넣어서 **최대 힙처럼 사용**할 수 있음.
🔎 코드 설명
import heapq
def solution(n, k, enemy):
answer = 0
N = len(enemy)
heap = []
for i in range(N):
n -= enemy[i]
heapq.heappush(heap, -enemy[i])
if n < 0:
if k > 0:
n -= heapq.heappop(heap)
k -= 1
else:
return i
return N
📌 핵심 로직 요약
✅ 왜 이 방법이 최적인가?
- 탐욕(Greedy) 전략: 가장 큰 비용을 줄이는 것이 전체 이득을 극대화
- 게임오버 전 소급 적용: 병사가 모자란 시점에서 가장 효과적인 되돌리기
- heapq 사용: 가장 큰
enemy[i]
를 O(log n) 시간에 찾아낼 수 있음
📈 시간 복잡도
- enemy 리스트 길이 = N
- 매 반복마다
heapq.heappush
+ 조건 시heappop
1회 - 모두 O(log N)이므로 전체는 O(N log N)
- 문제 조건 (최대 길이 1,000,000) 충분히 통과 가능
📌 결론 요약
무적권은 병사 소모를 줄이기 위해 쓰는 것이 아니라, 게임오버 직전 병사 수 부족을 피하기 위해, 과거의 가장 큰 적에 소급 적용해야 한다. 이 전략을 heap을 통해 효율적으로 구현하면 가장 많은 라운드를 막을 수 있으며, 해당 코드는 이 논리를 정확히 구현하고 있어 정답을 보장한다.
반응형
'백준 스터디 > 프로그래머스' 카테고리의 다른 글
프로그래머스 테이블 해시 함수 Python (0) | 2025.09.24 |
---|---|
"프로그래머스 '시소 짝꿍' python (0) | 2025.09.21 |
프로그래머스 '귤 고르기' Python (0) | 2025.09.16 |
프로그래머스 숫자 변환하기 Python (0) | 2025.09.15 |
프로그래머스 뒤에 있는 큰 수 찾기 python (0) | 2025.09.15 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 그리디
- dfs
- python 알고리즘
- 문자열처리
- 동적계획법
- 알고리즘기초
- 프로그래밍
- 인접 행렬
- 알고리즘 문제풀이
- 파이썬코딩
- 알고리즘
- C++ 알고리즘
- 백준
- c언어
- 파이썬
- 코딩 테스트
- 문제 풀이
- 알고리즘문제풀이
- 그리디알고리즘
- DP
- 객체지향
- C++
- Python
- 코딩
- 브루트포스
- c++알고리즘
- 동적 계획법
- 문제풀이
- 코딩테스트
- 그래프 탐색
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함
반응형