Skip to content

Commit cea349b

Browse files
authored
Merge pull request #2527 from liza0525/main
[liza0525] WEEK 06 Solutions
2 parents c379e12 + 95d2080 commit cea349b

5 files changed

Lines changed: 253 additions & 0 deletions

File tree

โ€Žcontainer-with-most-water/liza0525.pyโ€Ž

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,3 +29,36 @@ def maxArea(self, height: List[int]) -> int:
2929
)
3030

3131
return result_area
32+
33+
34+
# 7๊ธฐ ํ’€์ด
35+
# ์‹œ๊ฐ„ ๋ณต์žก๋„: O(n)
36+
# - two point ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ด์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— heights ๋ณ€์ˆ˜์˜ ๊ธธ์ด์ธ n์— ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ ์ •ํ•ด์ง
37+
# ๊ณต๊ฐ„ ๋ณต์žก๋„: O(1)
38+
# - ๋ช‡ ๊ฐœ์˜ ๋ณ€์ˆ˜๋งŒ ์‚ฌ์šฉํ•จ
39+
class Solution:
40+
def maxArea(self, height: List[int]) -> int:
41+
# ์–‘ ๋ ํฌ์ธํ„ฐ ์ง€์ •
42+
start, end = 0, len(height) - 1
43+
44+
# max_area๋Š” ํ˜„์žฌ ํฌ์ธํ„ฐ๋“ค์„ ์ด์šฉํ–ˆ์„ ๋•Œ์˜ ๋„“์ด ๊ณ„์‚ฐ
45+
# ์ด๋•Œ ๋†’์ด๋Š” ์ž‘์€ ์ชฝ์œผ๋กœ ์„ ํƒํ•˜์—ฌ ๊ณ„์‚ฐํ•ด์•ผ ํ•จ
46+
max_area = min(height[start], height[end]) * (end - start)
47+
48+
# start๊ฐ€ end๋ณด๋‹ค ์ž‘์„ ๋•Œ ๋ฃจํ”„ ๋Œ๊ธฐ
49+
while start < end:
50+
# ๋ฌธ์ œ์˜ ํ•ต์‹ฌ ์•„์ด๋””์–ด๋Š”, ๋†’์ด๊ฐ€ ํฐ ์ชฝ์„ ์›€์ง์ด๋ฉด ์–ป์„ ์ˆ˜ ์žˆ๋Š” ์ตœ์„ ์ด ํ˜„์žฌ๋ณด๋‹ค ํด ์ˆ˜ ์—†๋‹ค.
51+
# ์ด๋Š”, start์˜ ๋†’์ด์™€ end์˜ ๋†’์ด ์ค‘ ํฐ ์ชฝ์˜ ํฌ์ธํ„ฐ๋ฅผ ๊ณ ์ •ํ•˜์—ฌ ์›€์ง์—ฌ์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ
52+
# (๋ฌผ์˜ ๋†’์ด๋Š” ์ž‘์€ ์ชฝ์— ์˜ํ•ด ์ •ํ•ด์ง€๋Š”๋ฐ, ํฐ ์ชฝ ํฌ์ธํ„ฐ๋ฅผ ์›€์ง์ด๋ฉด x ๊ธธ์ด๋งŒ ์งง์•„์ง€๊ฒŒ ๋˜์–ด ์˜คํžˆ๋ ค ๋„“์ด์ด ์ค„์–ด๋“ฆ)
53+
if height[start] < height[end]:
54+
# start ์ชฝ์˜ ๋†’์ด๊ฐ€ ๋‚ฎ์œผ๋ฉด start๋ฅผ ์›€์ง์ž„
55+
start += 1
56+
else:
57+
# end ์ชฝ์˜ ๋†’์ด๊ฐ€ ๋‚ฎ์œผ๋ฉด end๋ฅผ ์›€์ง์ž„
58+
end -= 1
59+
60+
# ํฌ์ธํ„ฐ๋ฅผ ์˜ฎ๊ธฐ๊ณ  ๋‚œ ํ›„์˜ ๋„“์ด๋ฅผ ๊ณ„์‚ฐํ•˜์—ฌ, ๊ธฐ์กด์˜ max_area์™€ ๋น„๊ตํ•˜์—ฌ ํฐ ์ชฝ์œผ๋กœ ์—…๋ฐ์ดํŠธ
61+
curr_area = min(height[start], height[end]) * (end - start)
62+
max_area = max(max_area, curr_area)
63+
64+
return max_area
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
# 7๊ธฐ ํ’€์ด
2+
3+
# ํด๋ž˜์Šค ๊ณต๊ฐ„ ๋ณต์žก๋„: O(W * L)
4+
# - W๋Š” word์˜ ๊ฐœ์ˆ˜, L๋Š” word์˜ ํ‰๊ท  ๊ธธ์ด.
5+
6+
# addWord ๋ฉ”์„œ๋“œ
7+
# ์‹œ๊ฐ„ ๋ณต์žก๋„: O(L)
8+
# - L๋Š” word์˜ ๊ธธ์ด. word์˜ ๊ธธ์ด๋งŒํผ ํƒ์ƒ‰ํ•˜๋ฉฐ insertํ•จ
9+
# ๊ณต๊ฐ„ ๋ณต์žก๋„: O(L)
10+
# - L๋Š” word์˜ ๊ธธ์ด. ๊ธธ์ด๋งŒํผ ์žฌ๊ท€ ์Šคํƒ์ด ์Œ“์ž„
11+
12+
# search ๋ฉ”์„œ๋“œ
13+
# ์‹œ๊ฐ„ ๋ณต์žก๋„: O(W * L)
14+
# - W๋Š” ์ด๋ฏธ ์‚ฝ์ž…๋œ ๋‹จ์–ด์˜ ๊ฐœ์ˆ˜, L๋Š” word์˜ ํ‰๊ท  ๊ธธ์ด.
15+
# - ์ตœ์•…์ธ ์กฐ๊ฑด์€ word์˜ ๋ชจ๋“  ๋ฌธ์ž๋“ค์ด '.'์ผ ๋•Œ
16+
# ๊ณต๊ฐ„ ๋ณต์žก๋„: O(L)
17+
# - L๋Š” word์˜ ๊ธธ์ด. ๊ธธ์ด๋งŒํผ ์žฌ๊ท€ ์Šคํƒ์ด ์Œ“์ž„
18+
19+
20+
DELIMITER = "$" # ๋๋งบ์Œ์„ ๋‚˜ํƒ€๋‚ด๋Š” DELIMITER๋กœ "$"๋ฅผ ์‚ฌ์šฉ
21+
22+
23+
class WordDictionary:
24+
def __init__(self):
25+
self.word_dict = {}
26+
27+
def addWord(self, word: str) -> None:
28+
# ์žฌ๊ท€๋ฅผ ์ด์šฉํ•ด ๋‹จ์–ด๋ฅผ ๊ฐ ๋ฌธ์ž๋ณ„๋กœ insert
29+
def _add_word(curr_dict, word):
30+
if not word:
31+
# ๋๋งบ์Œ์„ ๋‚˜ํƒ€๋‚ด๋Š” DELIMITER๋กœ "$"๋ฅผ ์‚ฌ์šฉ
32+
curr_dict[DELIMITER] = {}
33+
return
34+
35+
s = word[0] # word์˜ ์ฒซ๋ฒˆ์งธ ๋ฌธ์ž
36+
if s not in curr_dict: # curr์— ์—†๋Š” ๊ฒฝ์šฐ์—๋Š” ์ƒˆ๋กœ key๋ฅผ ๋งŒ๋“ ๋‹ค.
37+
curr_dict[s] = {}
38+
39+
# ๋‹ค์Œ ๋ฌธ์ž๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ dictionary์™€
40+
# ํ•ด๋‹น depth์—์„œ ํ™•์ธํ•œ ๋ฌธ์ž๋ฅผ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€ ๋ฌธ์ž์—ด์„ ๊ฐ€์ง€๊ณ  ๋‹ค์Œ ์ž‘์—… ์ˆ˜ํ–‰
41+
_add_word(curr_dict[s], word[1:])
42+
43+
_add_word(self.word_dict, word)
44+
45+
46+
def search(self, word: str) -> bool:
47+
# ์žฌ๊ท€๋ฅผ ์ด์šฉํ•ด ๋‹จ์–ด๋ฅผ ๊ฐ ๋ฌธ์ž๋ณ„๋กœ ๋ށ์Šค๋ฅผ ํƒ€๊ณ  ๋‚ด๋ ค๊ฐ€ search
48+
def _search(curr_dict, word):
49+
if not word:
50+
# ๋”์ด์ƒ ๊ฒ€์ƒ‰ํ•  ๋ฌธ์ž์—ด์ด ์—†์„ ๋•
51+
# DELIMITER์˜ ์กด์žฌ ์—ฌ๋ถ€๋ฅผ ๋ณด๊ณ  return
52+
return DELIMITER in curr_dict
53+
54+
s = word[0]
55+
if s != '.' and s not in curr_dict:
56+
# ์™€์ผ๋“œ ์นด๋“œ ๋ฌธ์ž๊ฐ€ ์•„๋‹ˆ๋ฉด์„œ, ์ฐพ์œผ๋ ค๋Š” ๋ฌธ์ž๊ฐ€ dictionary์— ์—†์œผ๋ฉด
57+
# insert๊ฐ€ ๋œ ์ ์ด ์—†๋Š” ๋‹จ์–ด์ด๋ฏ€๋กœ False๋กœ early return
58+
return False
59+
elif s == '.':
60+
# ์™€์ผ๋“œ ์นด๋“œ ๋ฌธ์ž์ด๋ฉด curr_dict์— ์žˆ๋Š” ๋ชจ๋“  ๋ฌธ์ž์—ด์„ ๊ฐ€์ง€๊ณ  ๋‹ค์Œ depth๋ฅผ ํ™•์ธํ•œ๋‹ค.
61+
for k in curr_dict.keys():
62+
is_valid = _search(curr_dict[k], word[1:])
63+
if is_valid:
64+
# ํ•˜๋‚˜๋ผ๋„ True๋ผ๋ฉด search ๊ฒฐ๊ณผ๊ฐ€ ์œ ํšจํ•˜๊ธฐ ๋•Œ๋ฌธ์—
65+
# True๋กœ early return
66+
return True
67+
# ๋ชจ๋“  ๋ฌธ์ž์—ด์„ ํƒ์ƒ‰ํ•˜๊ณ ๋„ ๊ฒฐ๊ณผ๊ฐ€ ์—†๋‹ค๋ฉด False return
68+
return False
69+
else:
70+
# ๊ทธ ์™ธ์˜ ๊ฒฝ์šฐ๋Š” ์ผ๋ฐ˜ ๋ฌธ์ž์—ด ํƒ์ƒ‰์„ ํ•ด์•ผ ํ•˜๋ฏ€๋กœ
71+
# ์ž์‹ ๋ฌธ์ž์—ด์ด ์žˆ๋Š” curr_dict[s]์™€
72+
# ํ•ด๋‹น depth์—์„œ ํ™•์ธํ•œ ๋ฌธ์ž๋ฅผ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€ ๋ฌธ์ž์—ด์„ ๊ฐ€์ง€๊ณ  ๋‹ค์Œ ์ž‘์—… ์ˆ˜ํ–‰
73+
return _search(curr_dict[s], word[1:])
74+
75+
return _search(self.word_dict, word)
76+
77+
# Your WordDictionary object will be instantiated and called as such:
78+
# obj = WordDictionary()
79+
# obj.addWord(word)
80+
# param_2 = obj.search(word)
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
# 7๊ธฐ ํ’€์ด
2+
# ์‹œ๊ฐ„ ๋ณต์žก๋„: O(n^2)
3+
# - ๊ฐ ์›์†Œ๋งˆ๋‹ค ์ด์ „ ์ธ๋ฑ์Šค๋“ค์„ ๋ชจ๋‘ ํ™•์ธํ•˜๋ฏ€๋กœ ์ด์ค‘ for๋ฌธ์„ ๋Œ์•„์•ผ ํ•จ
4+
# ๊ณต๊ฐ„ ๋ณต์žก๋„: O(n)
5+
# - dp ๊ณ„์‚ฐ์„ ์œ„ํ•œ ๋ฆฌ์ŠคํŠธ๋Š” nums์˜ ๊ธธ์ด์— ์˜์กด
6+
class Solution:
7+
def lengthOfLIS(self, nums: List[int]) -> int:
8+
# ๊ฐ ์ธ๋ฑ์Šค์—์„œ์˜ ์ตœ๋Œ€ ๊ธธ์ด๋ฅผ ์ €์žฅํ•˜๋Š” dp ๋ฆฌ์ŠคํŠธ
9+
dp = [1 for _ in range(len(nums))]
10+
11+
for i in range(1, len(nums)):
12+
# i ์ธ๋ฑ์Šค๊นŒ์ง€์˜ ์ตœ๋Œ€ ๊ธธ์ด๋ฅผ ๊ณ„์‚ฐ ํ•˜๊ธฐ ์œ„ํ•ด
13+
# ์ด์ „ ์ธ๋ฑ์Šค๋“ค ์ค‘ ๊ฐ€์žฅ ๊ธด ๊ธธ์ด๋ฅผ ์ฐพ์•„๋‚ด์–ด ์ €์žฅํ•˜๋Š” ์žฅ์‹์ด๋‹ค.
14+
max_lis = 1
15+
for j in range(0, i):
16+
# j ์ธ๋ฑ์Šค์˜ ์˜๋ฏธ๋Š” i๋ณด๋‹ค ์ด์ „ ์ธ๋ฑ์Šค ํƒ๋ฐฉํ•˜๊ธฐ ์œ„ํ•จ
17+
if nums[j] < nums[i]: # ์ด์ „ ์ธ๋ฑ์Šค(j ์ธ๋ฑ์Šค)์— ์žˆ๋Š” ๊ฐ’์ด i ์ธ๋ฑ์Šค์˜ ๊ฐ’๋ณด๋‹ค ์ž‘๋‹ค๋ฉด
18+
# ๊ธฐ์กด์˜ max_lis์™€ j ์ธ๋ฑ์Šค๊นŒ์ง€์˜ ์ตœ๋Œ€ ๊ธธ์ด ๊ฐ’ + 1(i ์ธ๋ฑ์Šค ํฌํ•จํ•œ ๊ธธ์ด)๋ฅผ ๋น„๊ตํ•˜์—ฌ
19+
# ๋” ํฐ ์ˆ˜๋ฅผ max_list์— ์—…๋ฐ์ดํŠธ ํ•ด์ค€๋‹ค.
20+
max_lis = max(max_lis, dp[j] + 1)
21+
22+
# ๊ณ„์‚ฐ๋œ max_lis๋ฅผ dp[i]์— ์—…๋ฐ์ดํŠธ
23+
dp[i] = max_lis
24+
25+
return max(dp)

โ€Žspiral-matrix/liza0525.pyโ€Ž

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
# 7๊ธฐ ํ’€์ด
2+
# ํ’€์ด 1
3+
# ์‹œ๊ฐ„ ๋ณต์žก๋„: O(n * m)
4+
# - matrix์˜ ๊ฐ€๋กœ, ์„ธ๋กœ ๊ธธ์ด์˜ ๊ณฑ์— ๋น„๋ก€ํ•˜์—ฌ ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ ๊ณ„์‚ฐ๋จ(๋ชจ๋“  ์นธ์„ ๋‹ค ๋Œ๊ธฐ ๋•Œ๋ฌธ)
5+
# ๊ณต๊ฐ„ ๋ณต์žก๋„: O(n * m)
6+
# - matrix๋ฅผ ๋ฐฉ๋ฌธํ•  ๋•Œ๋งˆ๋‹ค visited๋ฅผ ์—…๋ฐ์ดํŠธ ํ•ด์ฃผ๊ณ  ์žˆ์–ด, n * m์˜ ๊ธธ์ด ๋งŒํผ ๋Š˜์–ด๋‚จ
7+
class Solution:
8+
def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
9+
len_i = len(matrix)
10+
len_j = len(matrix[0])
11+
visited = set() # ํ™•์ธํ•œ ์ธ๋ฑ์Šค์˜ ๊ฒฝ์šฐ์—๋Š” tuple์˜ ํ˜•ํƒœ๋กœ ๋„ฃ์–ด์ฃผ๋ ค๊ณ  ํ•จ
12+
13+
dirs = ((0, 1), (1, 0), (0, -1), (-1, 0)) # ์‹œ๊ณ„ ๋ฐฉํ–ฅ์„ ๋‚˜ํƒ€๋‚ด๋Š” tuple(์˜ค๋ฅธ์ชฝ, ์•„๋ž˜์ชฝ, ์™ผ์ชฝ, ์œ„์ชฝ ์ˆœ์„œ)
14+
15+
curr_dir_idx = 0 # ํ˜„์žฌ ๋ฐฉํ–ฅ์„ ๋‚˜ํƒ€๋‚ด๋Š” dirs์˜ index(0์ด๋ฉด ์˜ค๋ฅธ์ชฝ์„ ์˜๋ฏธ)
16+
curr_i, curr_j = 0, 0 # ์ฒ˜์Œ ์‹œ์ž‘์ ์ธ (0, 0) ์ธ๋ฑ์Šค๋ฅผ ์ง€์ •
17+
18+
result = []
19+
20+
while len(visited) < len_i * len_j: # ๋ชจ๋“  ์ธ๋ฑ์Šค์— ๋ฐฉ๋ฌธํ•  ๋•Œ๊นŒ์ง€ ๋ฃจํ”„ ๋Œ๊ธฐ
21+
result.append(matrix[curr_i][curr_j]) # result์— ๊ฐ’์„ ๋จผ์ € ๋„ฃ์–ด์ฃผ๊ณ 
22+
visited.add((curr_i, curr_j)) # visited์— ๋ฐฉ๋ฌธํ–ˆ๋‹ค๋Š” ๊ฒƒ์„ ํ‘œ์‹œ
23+
24+
dir_i, dir_j = dirs[curr_dir_idx] # ํ˜„์žฌ์˜ ์ง„ํ–‰ ๋ฐฉํ–ฅ ๊ฐ€์ ธ์˜ค๊ธฐ
25+
26+
if (
27+
(curr_i + dir_i, curr_j + dir_j) in visited # ๋‹ค์Œ ๋ฐฉ๋ฌธํ•  ๊ณณ์ด ์ด๋ฏธ ๋ฐฉ๋ฌธํ–ˆ๋˜ ํ–ˆ๊ฑฐ๋‚˜
28+
or not (0 <= curr_i + dir_i < len_i) # i ์ธ๋ฑ์Šค ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜๊ฑฐ๋‚˜
29+
or not (0 <= curr_j + dir_j < len_j) # j ์ธ๋ฑ์Šค ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜๋ฉด
30+
):
31+
curr_dir_idx = (curr_dir_idx + 1) % 4 # ๋ฐฉํ–ฅ index๋ฅผ ํ•˜๋‚˜ ์˜ฌ๋ ค์„œ
32+
dir_i, dir_j = dirs[curr_dir_idx] # ๋ฐฉํ–ฅ์„ ๋ฐ”๊ฟ”์ค€๋‹ค.
33+
34+
# curr_i, curr_j๋ฅผ ์—…๋ฐ์ดํŠธ ํ•˜์—ฌ ๋‹ค์Œ ๋ฃจํ”„์—์„œ ํƒ๋ฐฉํ•˜๊ฒŒ ํ•œ๋‹ค.
35+
curr_i, curr_j = curr_i + dir_i, curr_j + dir_j
36+
37+
return result
38+
39+
40+
# ํ’€์ด 2
41+
# ์‹œ๊ฐ„ ๋ณต์žก๋„: O(n * m)
42+
# - matrix์˜ ๊ฐ€๋กœ, ์„ธ๋กœ ๊ธธ์ด์˜ ๊ณฑ์— ๋น„๋ก€ํ•˜์—ฌ ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ ๊ณ„์‚ฐ๋จ(๋ชจ๋“  ์นธ์„ ๋‹ค ๋Œ๊ธฐ ๋•Œ๋ฌธ)
43+
# ๊ณต๊ฐ„ ๋ณต์žก๋„: O(1)
44+
# - ๋ณ€์ˆ˜ ๋ช‡ ๊ฐœ๋งŒ ์‚ฌ์šฉํ–ˆ์Œ(ํ’€์ด 1๊ณผ์˜ ๊ฐ€์žฅ ํฐ ์ฐจ์ด)
45+
class Solution:
46+
def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
47+
# ๊ฐ๊ฐ์— ๋Œ€ํ•œ ๊ฒฝ๊ณ„๋ฅผ ์ง€์ •ํ•˜์—ฌ ๊ณ„์‚ฐํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.
48+
# ์œ„, ์•„๋ž˜, ์™ผ์ชฝ, ์˜ค๋ฅธ์ชฝ์— ๋Œ€ํ•œ ์ตœ์ดˆ ๊ฒฝ๊ณ„ ์„ค์ •
49+
top, bottom, left, right = 0, len(matrix) - 1, 0, len(matrix[0]) - 1
50+
51+
# ์ฒ˜์Œ ๋ฐฉํ–ฅ ์„ค์ •(์˜ค๋ฅธ์ชฝ์œผ๋กœ ๊ฐ€๊ธฐ)
52+
dir_i, dir_j = 0, 1
53+
54+
# ์ฒ˜์Œ ๋ฐฉ๋ฌธ ์ธ๋ฑ์Šค ์„ค์ •
55+
curr_i, curr_j = 0, 0
56+
57+
result = []
58+
59+
# top์€ bottom๋ณด๋‹ค ์ปค์ง€๋ฉด ์•ˆ๋˜๊ณ 
60+
# left๋Š” right๋ณด๋‹ค ์ปค์ง€๋ฉด ์•ˆ๋œ๋‹ค.
61+
# ์ด์— ๋”ฐ๋ผ top <= bottom and left <= right ์กฐ๊ฑด์œผ๋กœ ๋ฃจํ”„ ๋Œ๊ธฐ
62+
while top <= bottom and left <= right:
63+
result.append(matrix[curr_i][curr_j]) # ํ•ด๋‹น ์ธ๋ฑ์Šค์— ์žˆ๋Š” ๊ฐ’์„ result์— ๋„ฃ๊ธฐ
64+
65+
if curr_i + dir_i < top: # 1. ๋‹ค์Œ ์ธ๋ฑ์Šค๊ฐ€ top ๊ฒฝ๊ณ„๋ฅผ ๋„˜์–ด๊ฐ€๋ ค๊ณ  ํ•  ๋•Œ
66+
dir_i, dir_j = 0, 1 # ๋ฐฉํ–ฅ์„ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ๋ณ€๊ฒฝํ•ด์ฃผ๊ณ 
67+
left += 1 # ์ง€๋‚˜์˜จ ์ธ๋ฑ์Šค๋“ค์ด ์ƒˆ๋กœ์šด ์™ผ์ชฝ ๊ฒฝ๊ณ„๊ฐ€ ๋˜๋ฏ€๋กœ, left์„ ํ•˜๋‚˜ ์˜ฌ๋ ค์ค€๋‹ค.
68+
elif curr_i + dir_i > bottom: # 2. ๋‹ค์Œ ์ธ๋ฑ์Šค๊ฐ€ bottom์˜ ๊ฒฝ๊ณ„๋ฅผ ๋„˜์–ด๊ฐ€๋ ค๊ณ  ํ•  ๋•Œ
69+
dir_i, dir_j = 0, -1 # ๋ฐฉํ–ฅ์„ ์™ผ์ชฝ์œผ๋กœ ๋ณ€๊ฒฝํ•ด์ฃผ๊ณ 
70+
right -= 1 # ์ง€๋‚˜์˜จ ์ธ๋ฑ์Šค๋“ค์ด ์ƒˆ๋กœ์šด ์˜ค๋ฅธ์ชฝ ๊ฒฝ๊ณ„๊ฐ€ ๋˜๋ฏ€๋กœ, right๋ฅผ ํ•˜๋‚˜ ๋‚ด๋ ค์ค€๋‹ค.
71+
elif curr_j + dir_j < left: # 3. ๋‹ค์Œ ์ธ๋ฑ์Šค๊ฐ€ left ๊ฒฝ๊ณ„๋ฅผ ๋„˜์–ด๊ฐ€๋ ค๊ณ  ํ•  ๋•Œ
72+
dir_i, dir_j = -1, 0 # ๋ฐฉํ–ฅ์„ ์œ„์ชฝ์œผ๋กœ ๋ณ€๊ฒฝํ•ด์ฃผ๊ณ 
73+
bottom -= 1 # ์ง€๋‚˜์˜จ ์ธ๋ฑ์Šค๋“ค์ด ์ƒˆ๋กœ์šด ์•„๋žซ์ชฝ ๊ฒฝ๊ณ„๊ฐ€ ๋˜๋ฏ€๋กœ, bottom์„ ํ•˜๋‚˜ ๋‚ด๋ ค์ค€๋‹ค.
74+
elif curr_j + dir_j > right: # 4. ๋‹ค์Œ ์ธ๋ฑ์Šค๊ฐ€ right ๊ฒฝ๊ณ„๋ฅผ ๋„˜์–ด๊ฐ€๋ ค๊ณ  ํ•  ๋–„
75+
dir_i, dir_j = 1, 0 # ๋ฐฉํ–ฅ์„ ์•„๋žซ์ชฝ์œผ๋กœ ๋ณ€๊ฒฝํ•ด์ฃผ๊ณ 
76+
top += 1 # ์ง€๋‚˜์˜จ ์ธ๋ฑ์Šค๋“ค์ด ์ƒˆ๋กœ์šด ์œ—์ชฝ ๊ฒฝ๊ณ„๊ฐ€ ๋˜๋ฏ€๋กœ, top์„ ํ•˜๋‚˜ ์˜ฌ๋ ค์ค€๋‹ค.
77+
78+
# curr_i, curr_j๋ฅผ ์—…๋ฐ์ดํŠธ ํ•˜์—ฌ ๋‹ค์Œ ๋ฃจํ”„์—์„œ ํƒ๋ฐฉํ•˜๊ฒŒ ํ•œ๋‹ค.
79+
curr_i, curr_j = curr_i + dir_i, curr_j + dir_j
80+
81+
return result

โ€Žvalid-parentheses/liza0525.pyโ€Ž

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,3 +61,37 @@ def isValid(self, s: str) -> bool:
6161
if stack:
6262
return False
6363
return True
64+
65+
66+
67+
# 7๊ธฐ ํ’€์ด
68+
# ์‹œ๊ฐ„ ๋ณต์žก๋„: O(n)
69+
# - s์˜ ๊ธธ์ด n์— ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ ์ •ํ•ด์ง
70+
# ๊ณต๊ฐ„ ๋ณต์žก๋„: O(n)
71+
# - ์™ผ์ชฝ ๊ด„ํ˜ธ๋ฅผ ์ €์žฅํ•  stacks(list) ๋ณ€์ˆ˜์˜ ๊ธธ์ด๋Š” s์˜ ๊ธธ์ด์— ์˜ํ•ด ์ •ํ•ด์ง
72+
# - stack์˜ ์ตœ๋Œ€ ๊ธธ์ด๋Š” s๊ฐ€ ๋ชจ๋‘ ์™ผ์ชฝ ๊ด„ํ˜ธ๋กœ ๋˜์–ด ์žˆ์„ ๋•Œ
73+
class Solution:
74+
def isValid(self, s: str) -> bool:
75+
# ์˜ค๋ฅธ์ชฝ ๊ด„ํ˜ธ๊ฐ€ ๋“ค์–ด์˜ฌ ๋•Œ์˜ ์Œ์„ ์‰ฝ๊ฒŒ ์ฐพ๊ธฐ ์œ„ํ•ด ๋งŒ๋“  dictionary
76+
brackets = {")": "(", "}": "{", "]": "["}
77+
78+
# ์™ผ์ชฝ ๊ด„ํ˜ธ๋ฅผ ์ €์žฅํ•  list
79+
stacks = []
80+
81+
for ss in s:
82+
if stacks and ss in brackets.keys():
83+
# stacks์— ๊ด„ํ˜ธ๊ฐ€ ์ €์žฅ๋˜์–ด ์žˆ์œผ๋ฉด์„œ, ss๋กœ ์˜ค๋ฅธ์ชฝ ๊ด„ํ˜ธ๊ฐ€ ๋“ค์–ด์˜ค๋ฉด
84+
# ์Œ์„ ๋น„๊ต
85+
if stacks[-1] != brackets[ss]:
86+
# stacks์˜ ๋งˆ์ง€๋ง‰ ๋ฌธ์ž(๊ฐ€์žฅ ๋Šฆ๊ฒŒ ๋“ค์–ด์˜จ ์™ผ์ชฝ ๊ด„ํ˜ธ)์™€ ํ˜„์žฌ ๋“ค์–ด์˜จ ์˜ค๋ฅธ์ชฝ ๊ด„ํ˜ธ์˜ ์Œ์ด ๊ฐ™์ง€ ์•Š์œผ๋ฉด
87+
# ๊ด„ํ˜ธ์˜ ์Œ์ด ๋งž์ง€ ์•Š์œผ๋ฏ€๋กœ False๋ฅผ early return
88+
return False
89+
else:
90+
# ์Œ์ด ๋งž๋Š”๋‹ค๋ฉด stacks์— ์žˆ๋Š” ๋งˆ์ง€๋ง‰ ์™ผ์ชฝ ๊ด„ํ˜ธ๋Š” ๋”์ด์ƒ ๋น„๊ตํ•  ํ•„์š”๊ฐ€ ์—†์œผ๋ฏ€๋กœ pop
91+
stacks.pop()
92+
else:
93+
# ss๊ฐ€ ์™ผ์ชฝ ๊ด„ํ˜ธ์ธ ๊ฒฝ์šฐ์—” stacks์— ์Œ“์•„์ค€๋‹ค
94+
stacks.append(ss)
95+
96+
# ๋ชจ๋“  ์Œ๋น„๊ต๋ฅผ ํ•˜๊ณ  stacks์— ๊ด„ํ˜ธ๊ฐ€ ๋‚จ์•„์žˆ๋Š” ์ง€ ์—ฌ๋ถ€๋ฅผ return
97+
return not stacks

0 commit comments

Comments
ย (0)