์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
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 |
Tags
- nlp
- Blazor
- ๋ฆฌํธ์ฝ๋
- ์์ฐ์ด์ฒ๋ฆฌ
- Python
- ๋จธ์ ๋ฌ๋
- Python3
- ์๊ณ ๋ฆฌ์ฆ
- GenAI
- ์์ฑํAI
- ํด๋ผ์ฐ๋
- Microsoft
- codeup
- ๊ตฌ๊ธํต๋ฉ
- gcp
- TwoPointer
- LeetCode
- ์ฝ๋์ ํ์ด์ฌ
- ๋ฆฟ์ฝ๋
- ํ์ด์ฌ
- C#
- GenerativeAI
- ๋น ๋ฐ์ดํฐ
- ์ฝ๋์
- Azure
- ํ์ด์ฌ๊ธฐ์ด100์
- ํ์ด์ฌ์๊ณ ๋ฆฌ์ฆ
- ํ์ด์ฌ๊ธฐ์ด
- ํฌํฌ์ธํฐ
- ๋ฐ์ดํฐ์ฌ์ด์ธ์ค
Archives
- Today
- Total
Tech for good
[Leetcode/Backtracking] 465. Optimal Account Balancing ๋ณธ๋ฌธ
IT/Computer Science
[Leetcode/Backtracking] 465. Optimal Account Balancing
Diana Kang 2025. 2. 17. 01:33๐น ๋ฌธ์ ํ์ด ์ ๊ทผ
์ด ๋ฌธ์ ๋ ์ต์ํ์ ๊ฑฐ๋๋ก ๋ชจ๋ ๋ถ์ฑ๋ฅผ ์ ์ฐํ๋ ๋ฌธ์ ์ด๋ค.
์ฆ, ๋๊ฐ ๋๊ตฌ์๊ฒ ๋์ ์ค์ผ ํ๋์ง ์ต์ํ์ ๊ฑฐ๋(transactions)๋ก ํด๊ฒฐํ๋ ๊ฒ์ด ๋ชฉํ์ด๋ค.
โ ํด๊ฒฐ ๋ฐฉ๋ฒ: Backtracking
- ๊ฐ ์ฌ๋์ ์ต์ข
์์ก์ ๊ณ์ฐ
- ์ฃผ์ด์ง ๊ฑฐ๋๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ฐ ์ฌ๋์ ์ ์์ก(balance)์ ๊ณ์ฐ.
- ์๋ฅผ ๋ค์ด, ์ด๋ค ์ฌ๋์ด $10 ๋น๋ ค์คฌ์ผ๋ฉด +10, $5 ๋น๋ ธ์ผ๋ฉด -5.
- ์์ก์ด 0์ด ์๋ ์ฌ๋๋ค์ ๋์์ผ๋ก ์ต์ ๊ฑฐ๋ ์กฐํฉ ์ฐพ๊ธฐ
- ๋ถ์ฑ(- ์์ก)์ ์์ฐ(+ ์์ก)์ ๋งค์นญํ์ฌ ์ต์ ๊ฑฐ๋๋ก ํด๊ฒฐ.
- ๋ฐฑํธ๋ํน(Backtracking)์ ํ์ฉํ์ฌ ๋ชจ๋ ๊ฐ๋ฅํ ๊ฑฐ๋๋ฅผ ํ์.
from collections import defaultdict
class Solution:
def minTransfers(self, transactions: List[List[int]]) -> int:
# 1๏ธโฃ ๊ฐ ์ฌ๋์ ์์ก(balance) ๊ณ์ฐ
balance = defaultdict(int) # ๊ธฐ๋ณธ๊ฐ์ด 0์ธ ๋์
๋๋ฆฌ ์์ฑ
for frm, to, amt in transactions:
balance[frm] -= amt # ๋์ ์ค ์ฌ๋์ ์์ก ๊ฐ์
balance[to] += amt # ๋์ ๋ฐ์ ์ฌ๋์ ์์ก ์ฆ๊ฐ
# 2๏ธโฃ 0์ด ์๋ ์์ก๋ง ๋ฆฌ์คํธ๋ก ์ ์ฅ (์์ก์ด 0์ด๋ฉด ๊ฑฐ๋๊ฐ ํ์ ์์)
debts = [bal for bal in balance.values() if bal != 0]
# 3๏ธโฃ ๋ฐฑํธ๋ํน์ ์ฌ์ฉํ์ฌ ์ต์ ๊ฑฐ๋ ์ ์ฐพ๊ธฐ
def backtracking(index):
# ํ์ฌ index๊ฐ ์์ก 0์ธ ๊ฒฝ์ฐ ๊ฑด๋๋ฐ๊ธฐ
while index < len(debts) and debts[index] == 0:
index += 1
# ๋ชจ๋ ๋ถ์ฑ๋ฅผ ์ฒ๋ฆฌํ์ผ๋ฉด ๊ฑฐ๋๊ฐ ํ์ ์์ (์ข
๋ฃ ์กฐ๊ฑด)
if index == len(debts):
return 0
min_transactions = float('inf') # ์ต์ ๊ฑฐ๋ ์๋ฅผ ์ ์ฅํ๋ ๋ณ์
# ํ์ฌ ๋ถ์ฑ(debts[index])๋ฅผ ํด๊ฒฐํ ์ ์๋ ๋ชจ๋ ๊ฒฝ์ฐ ํ์
for i in range(index + 1, len(debts)):
# debts[index]์ debts[i]๋ ์๋ก ๋ถ์ฑ(-)์ ์์ฐ(+)์ด์ด์ผ ๋งค์นญ ๊ฐ๋ฅ
if debts[i] * debts[index] < 0:
debts[i] += debts[index] # ํ์ฌ index์ ๋ถ์ฑ๋ฅผ i๋ฒ ์ฌ๋์ด ๊ฐ์์ค
min_transactions = min(min_transactions, 1 + backtracking(index + 1)) # ์ต์ ๊ฑฐ๋ ์ ์
๋ฐ์ดํธ
debts[i] -= debts[index] # ๋ฐฑํธ๋ํน (์๋ ์ํ๋ก ๋ณต๊ตฌ)
return min_transactions
# ๋ฐฑํธ๋ํน ์์ (index 0๋ถํฐ ํ์)
return backtracking(0)
๐น ์ฝ๋ ์ค๋ช
1๏ธโฃ ๊ฐ ์ฌ๋์ ์์ก(balance) ๊ณ์ฐ
balance = defaultdict(int)
for frm, to, amt in transactions:
balance[frm] -= amt # ๋์ ์ค ์ฌ๋์ ๊ฐ์
balance[to] += amt # ๋์ ๋ฐ์ ์ฌ๋์ ์ฆ๊ฐ
โก๏ธ ๊ฐ ์ฌ๋์ ์ต์ข ๋ถ์ฑ ๋๋ ์์ฐ์ ๊ณ์ฐ.
์์ 1 (transactions = [[0,1,10],[2,0,5]])
balance = { 0: -5, 1: 10, 2: -5 } # ๊ฐ ์ฌ๋์ ์์ก
โก๏ธ 0๋ฒ ์ฌ๋์ $5 ๋น์ง, 1๋ฒ ์ฌ๋์ $10 ๊ฐ์ง, 2๋ฒ ์ฌ๋์ $5 ๋น์ง.
2๏ธโฃ 0์ด ์๋ ์์ก๋ง ๋ฆฌ์คํธ๋ก ์ ์ฅ
debts = [bal for bal in balance.values() if bal != 0]
โก๏ธ debts = [-5, 10, -5] ๋ก ๋ณํ (์์ก 0์ธ ์ฌ๋์ ์ ์ธ).
3๏ธโฃ ๋ฐฑํธ๋ํน์ ์ด์ฉํ ์ต์ ๊ฑฐ๋ ํ์
โ ๋ฐฑํธ๋ํน ํ์ฉ
def backtracking(index):
while index < len(debts) and debts[index] == 0:
index += 1
if index == len(debts):
return 0 # ๋ชจ๋ ๋ถ์ฑ ํด๊ฒฐ๋จ
โก๏ธ ์์ก์ด 0์ธ ์ฌ๋์ ๋ฌด์ํ๊ณ ๋ค์ ์ฌ๋์ ์ฒดํฌ.
โก๏ธ ๋ชจ๋ ์ฌ๋์ด 0์ด๋ฉด ๊ฑฐ๋ ์ข
๋ฃ.
โ ๋ถ์ฑ์ ์์ฐ ๋งค์นญ
min_transactions = float('inf')
for i in range(index + 1, len(debts)):
if debts[i] * debts[index] < 0: # ๋ถ์ฑ(-)์ ์์ฐ(+) ๋งค์นญ ๊ฐ๋ฅ
debts[i] += debts[index] # ๋์ ์ฃผ๊ฑฐ๋ ๋ฐ์
min_transactions = min(min_transactions, 1 + backtracking(index + 1))
debts[i] -= debts[index] # ๋ฐฑํธ๋ํน (์์๋ณต๊ตฌ)
โก๏ธ ๋ชจ๋ ๊ฐ๋ฅํ ๊ฑฐ๋๋ฅผ ์๋ํ๊ณ ์ต์ํ์ ๊ฑฐ๋ ํ์ ์ฐพ๊ธฐ
โก๏ธ ๋ฐฑํธ๋ํน์ ํตํด ๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ํ์.
๐น ์๊ฐ ๋ณต์ก๋ ๋ถ์
- ๋ฐฑํธ๋ํน์ด๋ฏ๋ก ์ต์ ์ ๊ฒฝ์ฐ O(n!) (๋ชจ๋ ๊ฐ๋ฅํ ๊ฑฐ๋๋ฅผ ํ์)
- ํ์ง๋ง n ≤ 12์ด๋ฏ๋ก ์ถฉ๋ถํ ๋น ๋ฅด๊ฒ ์คํ๋จ.
- ํ๊ท ์ ์ผ๋ก O(2^n) ์ ๋๋ก ์คํ๋จ (ํจ์จ์ ์ธ pruning).
'IT > Computer Science' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Leetcode/TwoPointer] 189. Rotate Array (0) | 2025.02.18 |
---|---|
[Leetcode/Greedy] 1455. Check If a Word Occurs As a Prefix of Any Word in a Sentence (0) | 2025.02.17 |
[Leetcode/Binary Search] 4. Median of Two Sorted Arrays (0) | 2025.02.17 |
[Leetcode/Hash Map+Sorting] 3167. Better Compression of String (0) | 2025.02.17 |
[Leetcode/Two Pointer] 75. Sort Colors (0) | 2025.02.16 |