Skip to content

Commit 694335e

Browse files
authored
Merge pull request #823 from pmjuu/main
[Lyla] Week 04
2 parents 03ded85 + ff0482e commit 694335e

File tree

5 files changed

+237
-0
lines changed

5 files changed

+237
-0
lines changed

โ€Žcoin-change/pmjuu.py

+25
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
from typing import List
2+
3+
4+
class Solution:
5+
def coinChange(self, coins: List[int], amount: int) -> int:
6+
# dp[i]: i ๊ธˆ์•ก์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ์ตœ์†Œ ๋™์ „ ๊ฐœ์ˆ˜
7+
dp = [float('inf')] * (amount + 1)
8+
dp[0] = 0
9+
10+
for i in range(1, amount + 1):
11+
for coin in coins:
12+
if coin <= i:
13+
dp[i] = min(dp[i], dp[i - coin] + 1)
14+
15+
return dp[amount] if dp[amount] != float('inf') else -1
16+
17+
18+
# ์‹œ๊ฐ„ ๋ณต์žก๋„:
19+
# - ์™ธ๋ถ€ ๋ฐ˜๋ณต๋ฌธ์€ ๊ธˆ์•ก(amount)์˜ ๋ฒ”์œ„์— ๋น„๋ก€ํ•˜๊ณ  -> O(n) (n์€ amount)
20+
# - ๋‚ด๋ถ€ ๋ฐ˜๋ณต๋ฌธ์€ ๋™์ „์˜ ๊ฐœ์ˆ˜์— ๋น„๋ก€ํ•˜๋ฏ€๋กœ -> O(m) (m์€ coins์˜ ๊ธธ์ด)
21+
# - ์ด ์‹œ๊ฐ„ ๋ณต์žก๋„: O(n * m)
22+
23+
# ๊ณต๊ฐ„ ๋ณต์žก๋„:
24+
# - dp ๋ฐฐ์—ด์€ ๊ธˆ์•ก(amount)์˜ ํฌ๊ธฐ๋งŒํผ์˜ ๊ณต๊ฐ„์„ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ O(n)
25+
# - ์ถ”๊ฐ€ ๊ณต๊ฐ„ ์‚ฌ์šฉ์€ ์—†์œผ๋ฏ€๋กœ ์ด ๊ณต๊ฐ„ ๋ณต์žก๋„: O(n)

โ€Žmerge-two-sorted-lists/pmjuu.py

+33
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
from typing import Optional
2+
3+
4+
class ListNode:
5+
def __init__(self, val=0, next=None):
6+
self.val = val
7+
self.next = next
8+
9+
class Solution:
10+
def mergeTwoLists(self, list1: Optional[ListNode], list2: Optional[ListNode]) -> Optional[ListNode]:
11+
head = ListNode()
12+
current = head
13+
14+
while list1 and list2:
15+
if list1.val <= list2.val:
16+
current.next = list1
17+
list1 = list1.next
18+
else:
19+
current.next = list2
20+
list2 = list2.next
21+
22+
current = current.next
23+
24+
current.next = list1 or list2
25+
26+
return head.next
27+
28+
# ์‹œ๊ฐ„ ๋ณต์žก๋„:
29+
# - ๋‘ ๋ฆฌ์ŠคํŠธ์˜ ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ์ˆœํšŒํ•˜๋ฉฐ ๋ณ‘ํ•ฉํ•˜๋ฏ€๋กœ O(n + m) => O(n) ์œผ๋กœ ํ‘œํ˜„
30+
# ์—ฌ๊ธฐ์„œ n์€ list1์˜ ๊ธธ์ด, m์€ list2์˜ ๊ธธ์ด.
31+
#
32+
# ๊ณต๊ฐ„ ๋ณต์žก๋„:
33+
# - ๊ธฐ์กด ๋…ธ๋“œ๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๋ฏ€๋กœ O(1)

โ€Žmissing-number/pmjuu.py

+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
from typing import List
2+
3+
4+
class Solution:
5+
def missingNumber(self, nums: List[int]) -> int:
6+
n = len(nums)
7+
# 0๋ถ€ํ„ฐ n๊นŒ์ง€์˜ ์ˆซ์ž์˜ ํ•ฉ์„ ์ˆ˜ํ•™์  ํ•ฉ ๊ณต์‹์„ ์‚ฌ์šฉํ•ด ๊ณ„์‚ฐ
8+
total_sum = n * (n + 1) // 2
9+
10+
return total_sum - sum(nums)
11+
12+
# ์‹œ๊ฐ„ ๋ณต์žก๋„ O(n)
13+
# ๊ณต๊ฐ„ ๋ณต์žก๋„ O(1)

โ€Žpalindromic-substrings/pmjuu.py

+60
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
# Dynamic programming
2+
class Solution:
3+
def countSubstrings(self, s: str) -> int:
4+
n = len(s)
5+
dp = [[False] * n for _ in range(n)] # dp[i][j]๋Š” s[i:j+1]์ด ํŒฐ๋ฆฐ๋“œ๋กฌ์ธ์ง€ ๋‚˜ํƒ€๋ƒ„
6+
count = 0
7+
8+
for length in range(1, n + 1): # ๋ถ€๋ถ„ ๋ฌธ์ž์—ด ๊ธธ์ด
9+
for i in range(n - length + 1): # ์‹œ์ž‘ ์ธ๋ฑ์Šค
10+
j = i + length - 1 # ๋ ์ธ๋ฑ์Šค
11+
12+
if length == 1: # ๊ธธ์ด 1: ํ•ญ์ƒ ํŒฐ๋ฆฐ๋“œ๋กฌ
13+
dp[i][j] = True
14+
elif length == 2: # ๊ธธ์ด 2: ๋‘ ๋ฌธ์ž๊ฐ€ ๊ฐ™์œผ๋ฉด ํŒฐ๋ฆฐ๋“œ๋กฌ
15+
dp[i][j] = (s[i] == s[j])
16+
else: # ๊ทธ ์™ธ์˜ ๊ฒฝ์šฐ: ์–‘ ๋์ด ๊ฐ™๊ณ  ๋‚ด๋ถ€๊ฐ€ ํŒฐ๋ฆฐ๋“œ๋กฌ์ด๋ฉด ์ฐธ
17+
dp[i][j] = (s[i] == s[j] and dp[i + 1][j - 1])
18+
19+
if dp[i][j]:
20+
count += 1
21+
22+
return count
23+
24+
25+
# ์‹œ๊ฐ„ ๋ณต์žก๋„:
26+
# - ์ด์ค‘ ๋ฐ˜๋ณต๋ฌธ์œผ๋กœ ๋ชจ๋“  ๋ถ€๋ถ„ ๋ฌธ์ž์—ด์„ ํ™•์ธํ•˜๋ฏ€๋กœ O(n^2)
27+
# - ๊ฐ ํ™•์ธ์€ O(1)์ด๋ฏ€๋กœ ์ตœ์ข…์ ์œผ๋กœ O(n^2)
28+
29+
# ๊ณต๊ฐ„ ๋ณต์žก๋„:
30+
# - DP ํ…Œ์ด๋ธ”(dp)์€ O(n^2)์˜ ๊ณต๊ฐ„์„ ์‚ฌ์šฉ
31+
# - ์ถ”๊ฐ€ ๋ณ€์ˆ˜๋Š” O(1)์ด๋ฏ€๋กœ ์ „์ฒด ๊ณต๊ฐ„ ๋ณต์žก๋„๋Š” O(n^2)
32+
33+
34+
# ํˆฌ ํฌ์ธํ„ฐ ๋ฐฉ์‹
35+
class Solution:
36+
def countSubstrings(self, s: str) -> int:
37+
def expand_around_center(left: int, right: int) -> int:
38+
count = 0
39+
# ์ขŒ์šฐ๋กœ ํ™•์žฅํ•˜๋ฉฐ ํŒฐ๋ฆฐ๋“œ๋กฌ์ธ์ง€ ํ™•์ธ
40+
while left >= 0 and right < len(s) and s[left] == s[right]:
41+
count += 1
42+
left -= 1
43+
right += 1
44+
return count
45+
46+
total_count = 0
47+
for i in range(len(s)):
48+
# ํ™€์ˆ˜ ๊ธธ์ด ํŒฐ๋ฆฐ๋“œ๋กฌ (์ค‘์‹ฌ์ด ๋ฌธ์ž ํ•˜๋‚˜)
49+
total_count += expand_around_center(i, i)
50+
# ์ง์ˆ˜ ๊ธธ์ด ํŒฐ๋ฆฐ๋“œ๋กฌ (์ค‘์‹ฌ์ด ๋ฌธ์ž ๋‘ ๊ฐœ)
51+
total_count += expand_around_center(i, i + 1)
52+
53+
return total_count
54+
55+
# ์‹œ๊ฐ„ ๋ณต์žก๋„:
56+
# - ๊ฐ ๋ฌธ์ž์—์„œ ์ค‘์‹ฌ์„ ๊ธฐ์ค€์œผ๋กœ ํ™•์žฅํ•˜๋ฏ€๋กœ ์ตœ๋Œ€ O(n) ํ™•์žฅ
57+
# - ๋ชจ๋“  ๋ฌธ์ž์— ๋Œ€ํ•ด ํ™•์žฅ์„ ์‹œ๋„ํ•˜๋ฏ€๋กœ O(n^2)
58+
59+
# ๊ณต๊ฐ„ ๋ณต์žก๋„:
60+
# - ์ถ”๊ฐ€ ๊ณต๊ฐ„ ์‚ฌ์šฉ ์—†์ด O(1)

โ€Žword-search/pmjuu.py

+106
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
from typing import List
2+
3+
4+
class Solution:
5+
def exist(self, board: List[List[str]], word: str) -> bool:
6+
n, m, word_length = len(board), len(board[0]), len(word)
7+
8+
def search(row, col, word_idx, visited):
9+
# ๊ฒฝ๊ณ„ ์ฒดํฌ
10+
if not (0 <= row < n and 0 <= col < m):
11+
return False
12+
# ์ด๋ฏธ ๋ฐฉ๋ฌธํ–ˆ๊ฑฐ๋‚˜, ๋ฌธ์ž๊ฐ€ ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ
13+
if (row, col) in visited or board[row][col] != word[word_idx]:
14+
return False
15+
16+
# ๋ชจ๋“  ๋ฌธ์ž๋ฅผ ์ฐพ์€ ๊ฒฝ์šฐ
17+
if word_idx == word_length - 1:
18+
return True
19+
20+
# ํ˜„์žฌ ์…€์„ ๋ฐฉ๋ฌธํ•œ ๊ฒƒ์œผ๋กœ ํ‘œ์‹œ
21+
visited.add((row, col))
22+
23+
# ์ธ์ ‘ํ•œ ์…€ ํ™•์ธ
24+
found = (
25+
search(row - 1, col, word_idx + 1, visited) or
26+
search(row + 1, col, word_idx + 1, visited) or
27+
search(row, col - 1, word_idx + 1, visited) or
28+
search(row, col + 1, word_idx + 1, visited)
29+
)
30+
# ํ˜„์žฌ ์…€ ๋ฐฉ๋ฌธ ํ•ด์ œ (๋ฐฑํŠธ๋ž˜ํ‚น)
31+
visited.remove((row, col))
32+
33+
return found
34+
35+
# ๋ชจ๋“  ์…€์—์„œ ํƒ์ƒ‰ ์‹œ์ž‘
36+
for row in range(n):
37+
for col in range(m):
38+
if board[row][col] == word[0]:
39+
if search(row, col, 0, set()):
40+
return True
41+
42+
return False
43+
44+
# ํ’€์ด 1: ๋ฐฉ๋ฌธ ๊ธฐ๋ก์„ Set์œผ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ์‹
45+
# ์‹œ๊ฐ„ ๋ณต์žก๋„:
46+
# - ๊ฐ ์…€์—์„œ DFS๋ฅผ ์‹œ์ž‘ํ•˜๋ฉฐ, ๊ฐ DFS๋Š” ์ตœ๋Œ€ ๋„ค ๋ฐฉํ–ฅ์œผ๋กœ ์ด๋™ํ•˜๋ฉฐ word์˜ ๊ธธ์ด๋งŒํผ ์žฌ๊ท€ ํ˜ธ์ถœ์„ ์ง„ํ–‰ํ•จ.
47+
# - ์ตœ์•…์˜ ๊ฒฝ์šฐ O(n * 4^k), ์—ฌ๊ธฐ์„œ n์€ ์ „์ฒด ์…€์˜ ๊ฐœ์ˆ˜, k๋Š” word์˜ ๊ธธ์ด.
48+
# ๊ณต๊ฐ„ ๋ณต์žก๋„:
49+
# - visited Set ์‚ฌ์šฉ: O(k), ์—ฌ๊ธฐ์„œ k๋Š” word์˜ ๊ธธ์ด.
50+
# - ์žฌ๊ท€ ํ˜ธ์ถœ ์Šคํƒ: O(k), word์˜ ๊ธธ์ด๋งŒํผ ์žฌ๊ท€ ํ˜ธ์ถœ์ด ์Œ“์ž„.
51+
# => ์ด ๊ณต๊ฐ„ ๋ณต์žก๋„: O(k)
52+
53+
54+
class Solution:
55+
def exist(self, board: list[list[str]], word: str) -> bool:
56+
n, m = len(board), len(board[0])
57+
word_length = len(word)
58+
59+
# ์กฐ๊ธฐ ์ข…๋ฃŒ: board์— word๋ฅผ ๊ตฌ์„ฑํ•  ์ถฉ๋ถ„ํ•œ ๋ฌธ์ž๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธ
60+
from collections import Counter
61+
board_counter = Counter(char for row in board for char in row)
62+
word_counter = Counter(word)
63+
if any(word_counter[char] > board_counter[char] for char in word_counter):
64+
return False
65+
66+
def search(row, col, idx):
67+
# ๊ธฐ๋ณธ ์กฐ๊ฑด: ๋ชจ๋“  ๋ฌธ์ž๊ฐ€ ์ผ์น˜ํ•œ ๊ฒฝ์šฐ
68+
if idx == word_length:
69+
return True
70+
71+
# ๊ฒฝ๊ณ„ ์กฐ๊ฑด ๋ฐ ๋ฌธ์ž ์ผ์น˜ ์—ฌ๋ถ€ ํ™•์ธ
72+
if row < 0 or row >= n or col < 0 or col >= m or board[row][col] != word[idx]:
73+
return False
74+
75+
# ํ˜„์žฌ ์…€์„ ๋ฐฉ๋ฌธํ•œ ๊ฒƒ์œผ๋กœ ์ž„์‹œ ํ‘œ์‹œ
76+
temp = board[row][col]
77+
board[row][col] = "#"
78+
79+
# ๋ชจ๋“  ๋ฐฉํ–ฅ ํƒ์ƒ‰
80+
found = (
81+
search(row - 1, col, idx + 1) or
82+
search(row + 1, col, idx + 1) or
83+
search(row, col - 1, idx + 1) or
84+
search(row, col + 1, idx + 1)
85+
)
86+
87+
# ํƒ์ƒ‰ ํ›„ ์…€ ๋ณต์›
88+
board[row][col] = temp
89+
return found
90+
91+
# ์ฒซ ๋ฒˆ์งธ ๋ฌธ์ž์™€ ์ผ์น˜ํ•˜๋Š” ๋ชจ๋“  ์…€์—์„œ DFS ์‹œ์ž‘
92+
for i in range(n):
93+
for j in range(m):
94+
if board[i][j] == word[0] and search(i, j, 0):
95+
return True
96+
97+
return False
98+
99+
# ํ’€์ด 2: Board๋ฅผ ์ง์ ‘ ์ˆ˜์ •ํ•ด ๋ฐฉ๋ฌธ ๊ธฐ๋ก ๊ด€๋ฆฌ
100+
# ์‹œ๊ฐ„ ๋ณต์žก๋„:
101+
# - ๊ฐ ์…€์—์„œ DFS๋ฅผ ์‹œ์ž‘ํ•˜๋ฉฐ, ์ตœ๋Œ€ ๋„ค ๋ฐฉํ–ฅ์œผ๋กœ ์ด๋™ํ•˜๋ฉฐ word์˜ ๊ธธ์ด๋งŒํผ ์žฌ๊ท€ ํ˜ธ์ถœ์„ ์ง„ํ–‰ํ•จ.
102+
# - ์ตœ์•…์˜ ๊ฒฝ์šฐ O(n * 4^k), ์—ฌ๊ธฐ์„œ n์€ ์ „์ฒด ์…€์˜ ๊ฐœ์ˆ˜, k๋Š” word์˜ ๊ธธ์ด.
103+
# ๊ณต๊ฐ„ ๋ณต์žก๋„:
104+
# - ์ถ”๊ฐ€ ๊ณต๊ฐ„ ์‚ฌ์šฉ ์—†์ด Board๋ฅผ ์ง์ ‘ ์ˆ˜์ •: O(1).
105+
# - ์žฌ๊ท€ ํ˜ธ์ถœ ์Šคํƒ: O(k), word์˜ ๊ธธ์ด๋งŒํผ ์žฌ๊ท€ ํ˜ธ์ถœ์ด ์Œ“์ž„.
106+
# => ์ด ๊ณต๊ฐ„ ๋ณต์žก๋„: O(k)

0 commit comments

Comments
ย (0)