일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- 오블완
- 빅데이터
- docker
- programmers
- 도커
- 아파치 스파크
- 리트코드
- 파이썬
- Apache Hadoop
- 우선순위큐
- 이진탐색
- 아파치 하둡
- Data Engineering
- 코딩테스트
- Spark
- 하둡
- heapq
- Hadoop
- 프로그래머스
- 스파크
- 딕셔너리
- 분산처리
- Apache Spark
- 티스토리챌린지
- DP
- leetcode
- 데이터 엔지니어링
- Python
- 분산
- 알고리즘
- Today
- Total
래원
[LeetCode] 322. Coin Change (Python) 본문
난이도: Medium
문제 설명
You are given an integer array coins
representing coins of different denominations and an integer amount
representing a total amount of money.
Return the fewest number of coins that you need to make up that amount. If that amount of money cannot be made up by any combination of the coins, return -1
.
You may assume that you have an infinite number of each kind of coin.
문제 예제
Example 1:
Input: coins = [1,2,5], amount = 11
Output: 3
Explanation: 11 = 5 + 5 + 1
Example 2:
Input: coins = [2], amount = 3
Output: -1
Example 3:
Input: coins = [1], amount = 0
Output: 0
제한 사항
1 <= coins.length <= 12
1 <= coins[i] <= 2^31 - 1
0 <= amount <= 10^4
✏️ Solution(솔루션)
class Solution:
def coinChange(self, coins: List[int], amount: int) -> int:
if amount == 0:
return 0
dp = [float('inf') for _ in range(amount+1)]
for i in range(1, amount+1):
if i in coins:
dp[i] = 1
else:
for coin in coins:
if i-coin > 0:
dp[i] = min(dp[i], dp[i-coin] + dp[coin])
return dp[-1] if dp[-1] != float('inf') else -1
처음에는 아래와 같이 문제를 풀었는데 Time Limit Exceeded가 발생했다.
class Solution:
def coinChange(self, coins: List[int], amount: int) -> int:
dp = [0 for _ in range(amount+1)]
for i in range(1, amount+1):
if i in coins:
dp[i] = 1
else:
temp = float('inf')
for j in range(1, i):
temp = min(temp, dp[j] + dp[i-j])
dp[i] = temp
return dp[-1] if dp[-1] != float('inf') else -1
아마 for j in range(1,i): 반복문 때문일 것 같았다.
저 반복문을 돌린 이유는 만약 i가 coins에 없는 수이면서 6이라고 할때, 6을 만들 수 있는 최소의 수를 찾기 위해서 였다
ex) dp[i] = min(dp[1] + dp[5], dp[2] + dp[4], + dp[3] + dp[3])
하지만, i 값이 커지게 되면서 시간초과가 뜨는 것 같았다.
그래서 생각해보니 굳이 1부터 i까지 돌리 필요 없이 coins에 있는 수만 고려하면 될 것같았다.
그리고 coins의 최대 길이는 12이기 때문에 시간에 많은 영향도 없을 것 같았다.
그래서 다음과 같이 코드를 수정하고 정답을 맞출 수 있었다.
for coin in coins:
if i-coin > 0:
dp[i] = min(dp[i], dp[i-coin] + dp[coin])
문제: 322. Coin Change
깃허브: github
'알고리즘 > LeetCode' 카테고리의 다른 글
[LeetCode] 2559. Count Vowel Strings in Ranges (Python) (0) | 2025.01.02 |
---|---|
[LeetCode] 1422. Maximum Score After Splitting a String (Python) (0) | 2025.01.02 |
[LeetCode] 983. Minimum Cost For Tickets (Python) (0) | 2024.12.31 |
[LeetCode] 2466. Count Ways To Build Good Strings (Python) (0) | 2024.12.30 |
[LeetCode] 3286. Find a Safe Walk Through a Grid (Python) (0) | 2024.12.29 |