https://leetcode.com/problems/coin-change/
Coin Change - LeetCode
Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.
leetcode.com
처음 접근)
몫과 나머지, 그리고 각 변수가 사용된 개수를 활용하는 문제여서 당연히 dict지!라는 생각으로 접근을 했다
class Solution:
def coinChange(self, coins: List[int], amount: int) -> int:
coins.sort(reverse=True)
cal, res = {}, amount
try:
for i in coins:
if amount//i != 0:
cal[i] = amount//i
res -= i*(amount//i)
amount %= i
return sum(cal.values()) if res == 0 else -1
except KeyError:
return 0
example코드를 다 통과하고 자신만만하게 submit 했지만 역시나 에러,,,,
그래서 어떤 주제의 문제를 확인했더니 Dynamic Programming과 BFS라는 키워드가 있었다..
다른 코드들을 보면서 왜 이문제가 DP인지, BFS로 풀 수 있는지 알아보려 한다 ㅜ
Dynamic Programming )
class Solution:
def coinChange(self,coins: List[int], amount: int) -> int:
dp = [amount+1] * (amount+1)
dp[0] = 0
for a in range(1,amount+1):
for c in coins:
if a-c >= 0:
dp[a] = min(dp[a], 1+dp[a-c])
return dp[amount] if dp[amount] != amount + 1 else -1
coins = [1,2,5] ; amount = 11
a = 1, c = 1 , dp[1] = min(dp[1], 1 + dp[0]) = min(12,0) = 0
a= 1, c = 2 -> a-c가 음수로 pass
...
a = 2, c=1, dp[2] = min(dp[2], 1+dp[1]) = min(12,1) = 1
a= 2, c=2, dp[2] = min(dp[2],1+dp[0]) = min(1,1) = 1
...
a=3. c=1, dp[3] = min(dp[3], 1+dp[2]) = min(12,2) = 2
a=3. c=2, dp[3] = min(dp[3], 1+dp[1]) = min(12,1) = 1
a=5, c = 1, dp[5] = min(dp[5], 1+dp[4]) = min(12,12) = 12
a = 4, c = 2, dp[5] = min(dp[5], 1+dp[2]) = min(12,2) = 2
BFS )
def coinChange(self, coins: List[int], amount : int) -> int:
if amount == 0: return 0
seen = set()
count = 0
remainders = [amount]
while remainders:
count += 1
temp = []
for val in remainders:
for coin in coins:
rem = val - coin
if rem ==0:
return count
elif rem >0 and rem not in seen:
seen.add(rem)
temp.append(rem)
remainders = temp
return -1
(왜 코드블럭 indent가 계속 에러가 나는지 모르겠네요 ㅜㅠ)
이 코드는 BFS를 따른 코드다
전체적인 구조를 봤을 때 방문여부를 나타내는 seen을 만들고 , remainders을 만든뒤,
remainders 가 non-empty일 때 for 문을 통해 요소를 추출하고 방문여부를 체크한 뒤 temp에 더하는 방식 자체가 BFS의 전형적인 pseudocode를 따른 걸로 보인다.
'‼ ERROR RECORD' 카테고리의 다른 글
Leetcode 33. Search in Rotated Sorted Array(Binary Search) (0) | 2022.09.28 |
---|---|
Leetcode 200. Number of Islands (Union Find) (0) | 2022.09.27 |
Leetcode 207. Course Schedule 풀이 (Topological Sorting, BFS, DFS) (1) | 2022.09.23 |
Leetcode 102. Binary Tree Level Order Traversal (BFS) (0) | 2022.09.22 |
Leetcode 15. 3Sum (two-pointer) (0) | 2022.09.21 |
댓글