Skip to content

Commit 060bcfd

Browse files
authored
Merge pull request #1538 from taurus09318976/main
[taurus09318976]
2 parents edf4e96 + e1b17a4 commit 060bcfd

File tree

8 files changed

+606
-0
lines changed

8 files changed

+606
-0
lines changed

โ€Žclone-graph/taurus09318976.py

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
"""
2+
๋ฌธ์ œ์˜ ํ•ต์‹ฌ ํฌ์ธํŠธ:
3+
๊ฐ ๋…ธ๋“œ๋Š” ๊ฐ’๊ณผ ์ด์›ƒ ๋…ธ๋“œ๋“ค์˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ๊ฐ€์ง
4+
์›๋ณธ ๊ทธ๋ž˜ํ”„์™€ ์™„์ „ํžˆ ๋…๋ฆฝ์ ์ธ ์ƒˆ๋กœ์šด ๊ทธ๋ž˜ํ”„ ์ƒ์„ฑ
5+
๋ชจ๋“  ์—ฐ๊ฒฐ ๊ด€๊ณ„๋ฅผ ๊ทธ๋Œ€๋กœ ๋ณต์‚ฌ
6+
7+
ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•:
8+
DFS(๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰) + ํ•ด์‹œ๋งต์„ ์‚ฌ์šฉํ•จ:
9+
ํ•ด์‹œ๋งต์œผ๋กœ ์›๋ณธ ๋…ธ๋“œ์™€ ๋ณต์‚ฌ๋ณธ ๋…ธ๋“œ์˜ ๋งคํ•‘ ๊ด€๊ณ„ ์ €์žฅ
10+
DFS๋กœ ๊ทธ๋ž˜ํ”„๋ฅผ ์ˆœํšŒํ•˜๋ฉด์„œ ๊ฐ ๋…ธ๋“œ๋ฅผ ๋ณต์‚ฌ
11+
์ด๋ฏธ ๋ณต์‚ฌ๋œ ๋…ธ๋“œ๋Š” ํ•ด์‹œ๋งต์—์„œ ์ฐพ์•„์„œ ์žฌ์‚ฌ์šฉ
12+
13+
Example 1์˜ ๊ฒฝ์šฐ
14+
1 --- 2
15+
| |
16+
| |
17+
4 --- 3
18+
19+
์‹คํ–‰ ๊ณผ์ •:
20+
๋…ธ๋“œ 1 ๋ณต์‚ฌ: clone_1 ์ƒ์„ฑ, visited = clone_1
21+
๋…ธ๋“œ 1์˜ ์ด์›ƒ 2 ๋ณต์‚ฌ: clone_2 ์ƒ์„ฑ, visited = clone_2
22+
๋…ธ๋“œ 2์˜ ์ด์›ƒ 1 ์ฒ˜๋ฆฌ: ์ด๋ฏธ visited์— ์žˆ์œผ๋ฏ€๋กœ clone_1 ๋ฐ˜ํ™˜
23+
๋…ธ๋“œ 2์˜ ์ด์›ƒ 3 ๋ณต์‚ฌ: clone_3 ์ƒ์„ฑ, visited = clone_3
24+
๋…ธ๋“œ 3์˜ ์ด์›ƒ๋“ค ์ฒ˜๋ฆฌ: clone_2, clone_4 ์—ฐ๊ฒฐ
25+
๋…ธ๋“œ 1์˜ ์ด์›ƒ 4 ๋ณต์‚ฌ: clone_4 ์ƒ์„ฑ, visited = clone_4
26+
๋ชจ๋“  ์—ฐ๊ฒฐ ๊ด€๊ณ„ ์™„์„ฑ
27+
Output: ์›๋ณธ๊ณผ ๋™์ผํ•œ ๊ตฌ์กฐ์˜ ์™„์ „ํžˆ ์ƒˆ๋กœ์šด ๊ทธ๋ž˜ํ”„
28+
29+
์‹œ๊ฐ„ ๋ณต์žก๋„: O(V + E)
30+
V: ๋…ธ๋“œ(์ •์ )์˜ ๊ฐœ์ˆ˜, E: ๊ฐ„์„ ์˜ ๊ฐœ์ˆ˜
31+
๊ฐ ๋…ธ๋“œ๋ฅผ ํ•œ ๋ฒˆ์”ฉ ๋ฐฉ๋ฌธํ•˜๊ณ , ๊ฐ ๊ฐ„์„ ์„ ํ•œ ๋ฒˆ์”ฉ ์ฒ˜๋ฆฌ
32+
DFS์˜ ํ‘œ์ค€ ์‹œ๊ฐ„ ๋ณต์žก๋„
33+
34+
๊ณต๊ฐ„ ๋ณต์žก๋„: O(V)
35+
visited ํ•ด์‹œ๋งต์ด ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ์ €์žฅ: O(V)
36+
DFS ์žฌ๊ท€ ํ˜ธ์ถœ ์Šคํƒ์˜ ์ตœ๋Œ€ ๊นŠ์ด: O(V)
37+
๋ณต์‚ฌ๋œ ๊ทธ๋ž˜ํ”„ ์ž์ฒด๋„ O(V + E)์˜ ๊ณต๊ฐ„ ํ•„์š”
38+
"""
39+
40+
from typing import Optional
41+
class Solution:
42+
def cloneGraph(self, node: Optional['Node']) -> Optional['Node']:
43+
# ๋นˆ ๊ทธ๋ž˜ํ”„์ธ ๊ฒฝ์šฐ None ๋ฐ˜ํ™˜
44+
if not node:
45+
return None
46+
47+
# ์›๋ณธ ๋…ธ๋“œ๋ฅผ ํ‚ค๋กœ, ๋ณต์‚ฌ๋ณธ ๋…ธ๋“œ๋ฅผ ๊ฐ’์œผ๋กœ ํ•˜๋Š” ํ•ด์‹œ๋งต ์ƒ์„ฑ
48+
# ์ค‘๋ณต ๋ณต์‚ฌ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ณ  ์ˆœํ™˜ ์ฐธ์กฐ ๋ฌธ์ œ ํ•ด๊ฒฐ
49+
visited = {}
50+
51+
# DFS ํ•จ์ˆ˜ ์ •์˜
52+
def dfs(original_node):
53+
# ์ด๋ฏธ ๋ณต์‚ฌ๋œ ๋…ธ๋“œ๋ผ๋ฉด ๊ธฐ์กด ๋ณต์‚ฌ๋ณธ์„ ๋ฐ˜ํ™˜ (์ค‘๋ณต ๋ณต์‚ฌ ๋ฐฉ์ง€)
54+
if original_node in visited:
55+
return visited[original_node]
56+
57+
# ์›๋ณธ ๋…ธ๋“œ์˜ ๊ฐ’์œผ๋กœ ์ƒˆ๋กœ์šด ๋…ธ๋“œ ์ƒ์„ฑ
58+
# ์ด์›ƒ ๋ฆฌ์ŠคํŠธ๋Š” ๋นˆ ๋ฆฌ์ŠคํŠธ๋กœ ์ดˆ๊ธฐํ™”
59+
clone_node = Node(original_node.val, [])
60+
61+
# ํ•ด์‹œ๋งต์— ์›๋ณธ-๋ณต์‚ฌ๋ณธ ๋งคํ•‘ ๊ด€๊ณ„ ์ €์žฅ
62+
# ์ˆœํ™˜ ์ฐธ์กฐ ๋ฐฉ์ง€๋ฅผ ์œ„ํ•ด ์ด์›ƒ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์ „์— ๋จผ์ € ์ €์žฅ
63+
visited[original_node] = clone_node
64+
65+
# ์›๋ณธ ๋…ธ๋“œ์˜ ๋ชจ๋“  ์ด์›ƒ๋“ค์„ ์žฌ๊ท€์ ์œผ๋กœ ๋ณต์‚ฌ
66+
# ๋ณต์‚ฌ๋œ ์ด์›ƒ ๋…ธ๋“œ๋“ค์„ ํ˜„์žฌ ๋ณต์‚ฌ๋ณธ์˜ ์ด์›ƒ ๋ฆฌ์ŠคํŠธ์— ์ถ”๊ฐ€
67+
for neighbor in original_node.neighbors:
68+
# ์ด์›ƒ ๋…ธ๋“œ๋ฅผ ๋ณต์‚ฌํ•˜๊ณ  ํ˜„์žฌ ๋…ธ๋“œ์˜ ์ด์›ƒ ๋ฆฌ์ŠคํŠธ์— ์ถ”๊ฐ€
69+
clone_node.neighbors.append(dfs(neighbor))
70+
71+
# ์™„์„ฑ๋œ ๋ณต์‚ฌ๋ณธ ๋…ธ๋“œ ๋ฐ˜ํ™˜
72+
return clone_node
73+
74+
# ์ฃผ์–ด์ง„ ๋…ธ๋“œ๋ถ€ํ„ฐ DFS ์‹œ์ž‘
75+
return dfs(node)
76+
77+
78+
79+
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
'''
2+
*๋ฌธ์ œ์˜ ์˜๋„ :
3+
์ด ๋ฌธ์ œ๋Š” ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์— ์‚ฌ์ดํด์ด ์žˆ๋Š”์ง€ ํŒ๋‹จํ•˜๋Š” ๋ฌธ์ œ์ž„.
4+
์‚ฌ์ดํด์ด๋ž€ ์–ด๋–ค ๋…ธ๋“œ์—์„œ ์‹œ์ž‘ํ•ด์„œ next ํฌ์ธํ„ฐ๋ฅผ ๊ณ„์† ์ด๋™์‹œํ‚ค๋‹ค ๋‹ค์‹œ ์›๋ž˜ ๋…ธ๋“œ๋กœ ๋Œ์•„์˜ฌ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ๋ฅผ ๋งํ•จ
5+
6+
*ํ•ด๊ฒฐ๋ฐฉ๋ฒ• : ํ† ๋ผ์™€ ๊ฑฐ๋ถ์ด ์•Œ๊ณ ๋ฆฌ๋“ฌ์„ ์‚ฌ์šฉํ•จ
7+
๋‘ ๊ฐœ์˜ ํฌ์ธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๋ฐ, ๋А๋ฆฐ ํฌ์ธํ„ฐ(๊ฑฐ๋ถ์ด)๋Š” ํ•œ ๋ฒˆ์— ํ•œ์นธ์”ฉ ์ด๋™,
8+
๋น ๋ฅธ ํฌ์ธํ„ฐ(ํ† ๋ผ)๋Š” ํ•œ ๋ฒˆ์— ๋‘ ์นธ์”ฉ ์ด๋™, ์‚ฌ์ดํด์ด ์กด์žฌํ•œ๋‹ค๋ฉด ๋น ๋ฅธ ํฌ์ธํ„ฐ๊ฐ€ ๋А๋ฆฐ ํฌ์ธํ„ฐ๋ฅผ ๋”ฐ๋ผ์žก๊ฒŒ ๋จ.
9+
10+
*์‹œ๊ฐ„ ๋ณต์žก๋„์™€ ๊ณต๊ฐ„ ๋ณต์žก๋„
11+
์‹œ๊ฐ„ ๋ณต์žก๋„: O(n)
12+
์‚ฌ์ดํด์ด ์—†๋Š” ๊ฒฝ์šฐ: ๋น ๋ฅธ ํฌ์ธํ„ฐ๊ฐ€ n/2๋ฒˆ ์ด๋™ํ•˜์—ฌ ๋์— ๋„๋‹ฌํ•˜๋ฏ€๋กœ O(n)
13+
์‚ฌ์ดํด์ด ์žˆ๋Š” ๊ฒฝ์šฐ: ์ตœ์•…์˜ ๊ฒฝ์šฐ ์‚ฌ์ดํด ๋‚ด์—์„œ ๋А๋ฆฐ ํฌ์ธํ„ฐ์™€ ๋น ๋ฅธ ํฌ์ธํ„ฐ๊ฐ€ ๋งŒ๋‚  ๋•Œ๊นŒ์ง€ ์‚ฌ์ดํด ๊ธธ์ด๋งŒํผ ์ถ”๊ฐ€๋กœ ์ด๋™ํ•˜์ง€๋งŒ, ์ „์ฒด์ ์œผ๋กœ๋Š” ์—ฌ์ „ํžˆ O(n)
14+
15+
๊ณต๊ฐ„ ๋ณต์žก๋„: O(1)
16+
๋‘ ๊ฐœ์˜ ํฌ์ธํ„ฐ ๋ณ€์ˆ˜๋งŒ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ์ƒ์ˆ˜ ๊ณต๊ฐ„๋งŒ ํ•„์š”
17+
์ž…๋ ฅ ํฌ๊ธฐ์— ๊ด€๊ณ„์—†์ด ์ผ์ •ํ•œ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ
18+
19+
'''
20+
21+
class Solution:
22+
def hasCycle(self, head: Optional[ListNode]) -> bool:
23+
# ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๊ฐ€ ๋น„์–ด ์žˆ๊ฑฐ๋‚˜ ๋…ธ๋“œ๊ฐ€ ํ•˜๋‚˜๋ฟ์ด๋ฉด ์‚ฌ์ดํด์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ False ๋ฐ˜ํ™˜
24+
if not head or not head.next:
25+
return False
26+
27+
# ๋‘ ํฌ์ธํ„ฐ๋ฅผ ๋ชจ๋‘ head์—์„œ ์‹œ์ž‘ํ•˜๋„๋ก ์ดˆ๊ธฐํ™”
28+
slow = head # ๋А๋ฆฐ ํฌ์ธํ„ฐ (๊ฑฐ๋ถ์ด)
29+
fast = head # ๋น ๋ฅธ ํฌ์ธํ„ฐ (ํ† ๋ผ)
30+
31+
# ๋น ๋ฅธ ํฌ์ธํ„ฐ๊ฐ€ ๋‘ ์นธ์”ฉ ์ด๋™ํ•˜๋ฏ€๋กœ, fast์™€ fast.next ๋ชจ๋‘ ์กด์žฌํ•˜๋Š”์ง€ ํ™•์ธ
32+
while fast and fast.next:
33+
slow = slow.next # ๋А๋ฆฐ ํฌ์ธํ„ฐ๋Š” ํ•œ ์นธ์”ฉ ์ด๋™
34+
fast = fast.next.next # ๋น ๋ฅธ ํฌ์ธํ„ฐ๋Š” ๋‘ ์นธ์”ฉ ์ด๋™
35+
36+
# ๋‘ ํฌ์ธํ„ฐ๊ฐ€ ๊ฐ™์€ ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋ฉด ์‚ฌ์ดํด์ด ์กด์žฌํ•จ์„ ์˜๋ฏธ
37+
if slow == fast:
38+
return True
39+
40+
# ๋น ๋ฅธ ํฌ์ธํ„ฐ๊ฐ€ ๋์— ๋„๋‹ฌํ•˜๋ฉด ์‚ฌ์ดํด์ด ์—†๋‹ค๋Š” ์˜๋ฏธ
41+
return False
42+
43+
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
'''
2+
๋ฌธ์ œ์˜ ์˜๋„
3+
์ด ๋ฌธ์ œ๋Š” ๋ฌธ์ž์—ด์—์„œ ์ตœ๋Œ€ k๋ฒˆ์˜ ๋ฌธ์ž ๋ณ€๊ฒฝ์„ ํ†ตํ•ด ๊ฐ™์€ ๋ฌธ์ž๋กœ๋งŒ ์ด๋ฃจ์–ด์ง„ ๊ฐ€์žฅ ๊ธด ๋ถ€๋ถ„ ๋ฌธ์ž์—ด์„ ์ฐพ๋Š” ๋ฌธ์ œ์ž„.
4+
5+
ํ•ต์‹ฌ ํฌ์ธํŠธ:
6+
์ตœ๋Œ€ k๋ฒˆ๊นŒ์ง€ ๋ฌธ์ž๋ฅผ ๋‹ค๋ฅธ ๋ฌธ์ž๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์Œ
7+
๋ฐ”๊พผ ํ›„ ๊ฐ™์€ ๋ฌธ์ž๋กœ๋งŒ ์ด๋ฃจ์–ด์ง„ ๋ถ€๋ถ„ ๋ฌธ์ž์—ด์˜ ์ตœ๋Œ€ ๊ธธ์ด๋ฅผ ๊ตฌํ•ด์•ผ ํ•จ
8+
์—ฐ์†๋œ ๋ถ€๋ถ„ ๋ฌธ์ž์—ด์ด์–ด์•ผ ํ•จ
9+
10+
ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•
11+
์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ(Sliding Window) + ํ•ด์‹œ๋งต ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•จ:
12+
์œˆ๋„์šฐ ๋‚ด์—์„œ ๊ฐ€์žฅ ๋นˆ๋„๊ฐ€ ๋†’์€ ๋ฌธ์ž๋ฅผ ์ฐพ๊ธฐ
13+
๋‚˜๋จธ์ง€ ๋ฌธ์ž๋“ค์„ ๊ฐ€์žฅ ๋นˆ๋„๊ฐ€ ๋†’์€ ๋ฌธ์ž๋กœ ๋ฐ”๊พธ๋Š” ๋ฐ ํ•„์š”ํ•œ ๋ณ€๊ฒฝ ํšŸ์ˆ˜ ๊ณ„์‚ฐ
14+
๋ณ€๊ฒฝ ํšŸ์ˆ˜๊ฐ€ k๋ฅผ ์ดˆ๊ณผํ•˜๋ฉด ์œˆ๋„์šฐ ์ถ•์†Œ
15+
16+
์‹คํ–‰ ๊ณผ์ •:
17+
์œˆ๋„์šฐ "A": max_freq=1, ๋ณ€๊ฒฝ ํ•„์š”=0 โ‰ค k=1
18+
์œˆ๋„์šฐ "AA": max_freq=2, ๋ณ€๊ฒฝ ํ•„์š”=0 โ‰ค k=1
19+
์œˆ๋„์šฐ "AAB": max_freq=2, ๋ณ€๊ฒฝ ํ•„์š”=1 โ‰ค k=1
20+
์œˆ๋„์šฐ "AABA": max_freq=3, ๋ณ€๊ฒฝ ํ•„์š”=1 โ‰ค k=1
21+
์œˆ๋„์šฐ "AABAB": max_freq=3, ๋ณ€๊ฒฝ ํ•„์š”=2 > k=1
22+
์œˆ๋„์šฐ ์ถ•์†Œ: "ABAB" โ†’ max_freq=2, ๋ณ€๊ฒฝ ํ•„์š”=2 > k=1
23+
๊ณ„์† ์ถ•์†Œ: "BAB" โ†’ max_freq=2, ๋ณ€๊ฒฝ ํ•„์š”=1 โ‰ค k=1
24+
Output: 4 (์œˆ๋„์šฐ "AABA"์—์„œ B ํ•˜๋‚˜๋ฅผ A๋กœ ๋ฐ”๊พธ๋ฉด "AAAA")
25+
26+
ํ•ต์‹ฌ ์•„์ด๋””์–ด:
27+
์œˆ๋„์šฐ ๋‚ด์—์„œ ๊ฐ€์žฅ ๋งŽ์€ ๋ฌธ์ž๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ•˜๊ณ ,
28+
๋‚˜๋จธ์ง€ ๋ฌธ์ž๋“ค์„ ๊ทธ ๋ฌธ์ž๋กœ ๋ฐ”๊พธ๋Š” ๋ฐ ํ•„์š”ํ•œ ๋ณ€๊ฒฝ ํšŸ์ˆ˜๊ฐ€ k ์ดํ•˜์ธ์ง€ ํ™•์ธ.
29+
30+
์‹œ๊ฐ„ ๋ณต์žก๋„: O(n)
31+
๊ฐ ๋ฌธ์ž๊ฐ€ ์ตœ๋Œ€ 2๋ฒˆ ๋ฐฉ๋ฌธ๋จ (right ํฌ์ธํ„ฐ๋กœ 1๋ฒˆ, left ํฌ์ธํ„ฐ๋กœ 1๋ฒˆ)
32+
ํ•ด์‹œ๋งต ์—ฐ์‚ฐ์€ O(1)์ด๋ฏ€๋กœ ์ „์ฒด์ ์œผ๋กœ ์„ ํ˜• ์‹œ๊ฐ„
33+
34+
๊ณต๊ฐ„ ๋ณต์žก๋„: O(1)
35+
์˜์–ด ๋Œ€๋ฌธ์ž๋งŒ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ํ•ด์‹œ๋งต ํฌ๊ธฐ๋Š” ์ตœ๋Œ€ 26๊ฐœ๋กœ ์ƒ์ˆ˜
36+
๊ธฐํƒ€ ๋ณ€์ˆ˜๋“ค๋„ ์ƒ์ˆ˜ ๊ณต๊ฐ„
37+
'''
38+
39+
class Solution:
40+
def characterReplacement(self, s: str, k: int) -> int:
41+
# ํ˜„์žฌ ์œˆ๋„์šฐ ๋‚ด ๊ฐ ๋ฌธ์ž์˜ ๊ฐœ์ˆ˜๋ฅผ ์ €์žฅํ•˜๋Š” ํ•ด์‹œ๋งต
42+
char_count = {}
43+
44+
# ์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ์˜ ์‹œ์ž‘์ 
45+
left = 0
46+
47+
# ์œˆ๋„์šฐ ๋‚ด์—์„œ ๊ฐ€์žฅ ๋นˆ๋„๊ฐ€ ๋†’์€ ๋ฌธ์ž์˜ ๊ฐœ์ˆ˜
48+
max_freq = 0
49+
50+
# ๊ฒฐ๊ณผ๋กœ ๋ฐ˜ํ™˜ํ•  ์ตœ๋Œ€ ๊ธธ์ด
51+
max_length = 0
52+
53+
# ์˜ค๋ฅธ์ชฝ ํฌ์ธํ„ฐ๋กœ ๋ฌธ์ž์—ด์„ ์ˆœํšŒํ•˜๋ฉฐ ์œˆ๋„์šฐ ํ™•์žฅ
54+
for right in range(len(s)):
55+
# ํ˜„์žฌ ๋ฌธ์ž๋ฅผ ์œˆ๋„์šฐ์— ์ถ”๊ฐ€ํ•˜๊ณ  ๋นˆ๋„ ์ฆ๊ฐ€
56+
char = s[right]
57+
char_count[char] = char_count.get(char, 0) + 1
58+
59+
# ํ˜„์žฌ ์œˆ๋„์šฐ์—์„œ ๊ฐ€์žฅ ๋นˆ๋„๊ฐ€ ๋†’์€ ๋ฌธ์ž์˜ ๊ฐœ์ˆ˜ ์—…๋ฐ์ดํŠธ
60+
max_freq = max(max_freq, char_count[char])
61+
62+
# ํ˜„์žฌ ์œˆ๋„์šฐ ํฌ๊ธฐ
63+
window_size = right - left + 1
64+
65+
# ๋ณ€๊ฒฝํ•ด์•ผ ํ•  ๋ฌธ์ž ๊ฐœ์ˆ˜ = ์ „์ฒด ์œˆ๋„์šฐ ํฌ๊ธฐ - ๊ฐ€์žฅ ๋งŽ์€ ๋ฌธ์ž ๊ฐœ์ˆ˜
66+
# ์ด ๊ฐ’์ด k๋ณด๋‹ค ํฌ๋ฉด ์œˆ๋„์šฐ๊ฐ€ ์œ ํšจํ•˜์ง€ ์•Š์Œ
67+
if window_size - max_freq > k:
68+
# ์™ผ์ชฝ ๋ฌธ์ž๋ฅผ ์œˆ๋„์šฐ์—์„œ ์ œ๊ฑฐํ•˜๊ณ  ์™ผ์ชฝ ํฌ์ธํ„ฐ ์ด๋™
69+
left_char = s[left]
70+
char_count[left_char] -= 1
71+
left += 1
72+
73+
# ํ˜„์žฌ ์œˆ๋„์šฐ ํฌ๊ธฐ๋กœ ์ตœ๋Œ€ ๊ธธ์ด ์—…๋ฐ์ดํŠธ
74+
max_length = max(max_length, right - left + 1)
75+
76+
return max_length
77+
78+
79+
80+
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
'''
2+
๋ฌธ์ œ์˜ ์˜๋„
3+
์ด ๋ฌธ์ œ๋Š” ๋ฐฐ์—ด์—์„œ ์—ฐ์†๋œ ๋ถ€๋ถ„ ๋ฐฐ์—ด์˜ ๊ณฑ์ด ์ตœ๋Œ€๊ฐ€ ๋˜๋Š” ๊ฐ’์„ ์ฐพ๋Š” ๋ฌธ์ œ์ž„.
4+
์Œ์ˆ˜๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‹จ์ˆœํžˆ ์ตœ๋Œ€๊ฐ’๋งŒ ์ถ”์ ํ•˜๋ฉด ์•ˆ ๋˜๊ณ , ๋™์‹œ์— ์ตœ์†Œ๊ฐ’๋„ ์ถ”์ ํ•ด์•ผ ํ•จ.
5+
6+
ํ•ต์‹ฌ ํฌ์ธํŠธ
7+
์Œ์ˆ˜ ร— ์Œ์ˆ˜ = ์–‘์ˆ˜ (ํฐ ์–‘์ˆ˜๊ฐ€ ๋  ์ˆ˜ ์žˆ์Œ)
8+
์Œ์ˆ˜ ร— ์–‘์ˆ˜ = ์Œ์ˆ˜ (์ž‘์•„์ง)
9+
0์ด ์žˆ์œผ๋ฉด ๊ณฑ์ด 0์ด ๋จ
10+
11+
ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•
12+
๋™์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์‚ฌ์šฉํ•˜๋˜, ์ตœ๋Œ€๊ฐ’๊ณผ ์ตœ์†Œ๊ฐ’์„ ๋™์‹œ์— ์ถ”์ :
13+
14+
์ตœ๋Œ€๊ฐ’: ์–‘์ˆ˜ ๊ฒฐ๊ณผ๋ฅผ ์œ„ํ•ด
15+
์ตœ์†Œ๊ฐ’: ์Œ์ˆ˜๊ฐ€ ๋‚˜์ค‘์— ์–‘์ˆ˜๋กœ ๋ฐ”๋€” ๊ฐ€๋Šฅ์„ฑ์„ ์œ„ํ•ด
16+
17+
์‹œ๊ฐ„ ๋ณต์žก๋„: O(n)
18+
๋ฐฐ์—ด์„ ํ•œ ๋ฒˆ๋งŒ ์ˆœํšŒํ•˜๋ฏ€๋กœ O(n)
19+
๊ฐ ์›์†Œ์—์„œ ์ƒ์ˆ˜ ์‹œ๊ฐ„์˜ ์—ฐ์‚ฐ๋งŒ ์ˆ˜ํ–‰
20+
21+
๊ณต๊ฐ„ ๋ณต์žก๋„: O(1)
22+
์ถ”๊ฐ€ ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Œ
23+
๋ช‡ ๊ฐœ์˜ ๋ณ€์ˆ˜๋งŒ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ์ƒ์ˆ˜ ๊ณต๊ฐ„
24+
'''
25+
26+
class Solution:
27+
def maxProduct(self, nums: List[int]) -> int:
28+
# ๋นˆ ๋ฐฐ์—ด ์ฒ˜๋ฆฌ
29+
if not nums:
30+
return 0
31+
32+
# ์ฒซ ๋ฒˆ์งธ ์›์†Œ๋กœ ๋ชจ๋“  ๊ฐ’๋“ค์„ ์ดˆ๊ธฐํ™”
33+
max_product = nums[0] # ์ „์ฒด ์ตœ๋Œ€๊ฐ’
34+
current_max = nums[0] # ํ˜„์žฌ ์œ„์น˜๊นŒ์ง€์˜ ์ตœ๋Œ€ ๊ณฑ
35+
current_min = nums[0] # ํ˜„์žฌ ์œ„์น˜๊นŒ์ง€์˜ ์ตœ์†Œ ๊ณฑ
36+
37+
# ๋‘ ๋ฒˆ์งธ ์›์†Œ๋ถ€ํ„ฐ ๋ฐฐ์—ด์„ ์ˆœํšŒํ•˜๋ฉฐ ํ˜„์žฌ ์ˆซ์ž๋ฅผ ์ €์žฅ
38+
for i in range(1, len(nums)):
39+
num = nums[i]
40+
41+
# ํ˜„์žฌ ์ˆซ์ž๊ฐ€ ์Œ์ˆ˜์ผ ๊ฒฝ์šฐ๋ฅผ ๋Œ€๋น„ํ•ด max์™€ min์„ ์ž„์‹œ ์ €์žฅ
42+
temp_max = current_max
43+
44+
# ์ƒˆ๋กœ์šด ์ตœ๋Œ€๊ฐ’ ๊ณ„์‚ฐ: ์ตœ๋Œ€๊ฐ’๊ณผ ์ตœ์†Œ๊ฐ’ ๋ชจ๋‘ ์•„๋ž˜์˜ 3๊ฐœ ์ค‘์—์„œ ๋‚˜์˜ฌ ์ˆ˜ ์žˆ์Œ
45+
# num : ํ˜„์žฌ ์ˆซ์ž๋ถ€ํ„ฐ ์ƒˆ๋กœ ์‹œ์ž‘
46+
# temp_max * num : ํ˜„์žฌ์ˆซ์ž ร— ์ด์ „์ตœ๋Œ€๊ฐ’
47+
# current_min * num : ํ˜„์žฌ์ˆซ์ž ร— ์ด์ „์ตœ์†Œ๊ฐ’(์Œ์ˆ˜*์Œ์ˆ˜=์–‘์ˆ˜ ๊ฐ€๋Šฅ์„ฑ ๋–„๋ฌธ์—)
48+
current_max = max(num, temp_max * num, current_min * num)
49+
50+
# ์ƒˆ๋กœ์šด ์ตœ์†Œ๊ฐ’ ๊ณ„์‚ฐ: ๋‚˜์ค‘์— ์Œ์ˆ˜์™€ ๊ณฑํ•ด์ ธ์„œ ํฐ ์–‘์ˆ˜๊ฐ€ ๋  ๊ฐ€๋Šฅ์„ฑ์„ ์œ„ํ•ด
51+
# ํ˜„์žฌ ์ˆซ์ž, ํ˜„์žฌ์ˆซ์žร—์ด์ „์ตœ๋Œ€, ํ˜„์žฌ์ˆซ์žร—์ด์ „์ตœ์†Œ ์ค‘ ์ตœ์†Œ
52+
current_min = min(num, temp_max * num, current_min * num)
53+
54+
# ์ง€๊ธˆ๊นŒ์ง€์˜ ์ „์ฒด ์ตœ๋Œ€๊ฐ’๊ณผ ํ˜„์žฌ ์ตœ๋Œ€๊ฐ’์„ ๋น„๊ตํ•˜์—ฌ ์—…๋ฐ์ดํŠธ
55+
max_product = max(max_product, current_max)
56+
57+
return max_product
58+
59+
Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
'''
2+
๋ฌธ์ œ์˜ ์˜๋„
3+
์ด ๋ฌธ์ œ๋Š” ๋ฌธ์ž์—ด s์—์„œ ๋ฌธ์ž์—ด t์˜ ๋ชจ๋“  ๋ฌธ์ž(์ค‘๋ณต ํฌํ•จ)๋ฅผ ํฌํ•จํ•˜๋Š” ๊ฐ€์žฅ ์งง์€ ๋ถ€๋ถ„ ๋ฌธ์ž์—ด์„ ์ฐพ๋Š” ๋ฌธ์ œ์ž„.
4+
5+
ํ•ต์‹ฌ ํฌ์ธํŠธ:
6+
1) t์˜ ๋ชจ๋“  ๋ฌธ์ž๊ฐ€ ํฌํ•จ๋˜์–ด์•ผ ํ•จ (์ค‘๋ณต ๊ฐœ์ˆ˜๋„ ๋งž์•„์•ผ ํ•จ)
7+
2) ๊ฐ€์žฅ ์งง์€ ๊ธธ์ด์˜ ๋ถ€๋ถ„ ๋ฌธ์ž์—ด์„ ์ฐพ์•„์•ผ ํ•จ
8+
3) ์—ฐ์†๋œ ๋ถ€๋ถ„ ๋ฌธ์ž์—ด์ด์–ด์•ผ ํ•จ
9+
10+
ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•
11+
์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ + ํˆฌ ํฌ์ธํ„ฐ ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•จ:
12+
์˜ค๋ฅธ์ชฝ ํฌ์ธํ„ฐ๋กœ ์œˆ๋„์šฐ๋ฅผ ํ™•์žฅํ•˜์—ฌ ์กฐ๊ฑด์„ ๋งŒ์กฑ์‹œํ‚ด
13+
์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋ฉด ์™ผ์ชฝ ํฌ์ธํ„ฐ๋กœ ์œˆ๋„์šฐ๋ฅผ ์ถ•์†Œํ•˜์—ฌ ์ตœ์†Œ ๊ธธ์ด ์ฐพ๊ธฐ
14+
ํ•ด์‹œ๋งต์œผ๋กœ ๋ฌธ์ž ๊ฐœ์ˆ˜๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌ
15+
16+
Example 1์˜ ๊ฒฝ์šฐ๋ฅผ ๋ณด๋ฉด,
17+
18+
Input: s = "ADOBECODEBANC", t = "ABC"
19+
20+
์‹คํ–‰ ๊ณผ์ •:
21+
t_count: {'A':1, 'B':1, 'C':1}, required = 3
22+
์œˆ๋„์šฐ ํ™•์žฅ: right ํฌ์ธํ„ฐ๋กœ "ADOBEC"๊นŒ์ง€ ํ™•์žฅ โ†’ ์กฐ๊ฑด ๋งŒ์กฑ
23+
์œˆ๋„์šฐ ์ถ•์†Œ: left ํฌ์ธํ„ฐ๋กœ "ODEBANC" โ†’ "BANC"๊นŒ์ง€ ์ถ•์†Œ
24+
์ตœ์ข… ๊ฒฐ๊ณผ: "BANC" (๊ธธ์ด 4)
25+
26+
Output: "BANC"
27+
28+
์‹œ๊ฐ„ ๋ณต์žก๋„: O(|s| + |t|)
29+
๊ฐ ๋ฌธ์ž๊ฐ€ ์ตœ๋Œ€ 2๋ฒˆ ๋ฐฉ๋ฌธ๋จ (right ํฌ์ธํ„ฐ๋กœ 1๋ฒˆ, left ํฌ์ธํ„ฐ๋กœ 1๋ฒˆ)
30+
t๋ฅผ ํ•œ ๋ฒˆ ์ˆœํšŒํ•˜์—ฌ ํ•ด์‹œ๋งต ์ƒ์„ฑ: O(|t|)
31+
์ „์ฒด์ ์œผ๋กœ ์„ ํ˜• ์‹œ๊ฐ„ ๋ณต์žก๋„
32+
33+
๊ณต๊ฐ„ ๋ณต์žก๋„: O(|s| + |t|)
34+
t_count ํ•ด์‹œ๋งต: O(|t|)
35+
window_counts ํ•ด์‹œ๋งต: ์ตœ๋Œ€ O(|s|)
36+
๊ธฐํƒ€ ๋ณ€์ˆ˜๋“ค: O(1)
37+
'''
38+
39+
class Solution:
40+
def minWindow(self, s: str, t: str) -> str:
41+
# t๊ฐ€ ๋นˆ ๋ฌธ์ž์—ด์ด๋ฉด ๋นˆ ๋ฌธ์ž์—ด ๋ฐ˜ํ™˜
42+
if not t:
43+
return ""
44+
45+
# t์˜ ๊ฐ ๋ฌธ์ž ๊ฐœ์ˆ˜๋ฅผ ์ €์žฅํ•˜๋Š” ํ•ด์‹œ๋งต
46+
t_count = {}
47+
for char in t:
48+
t_count[char] = t_count.get(char, 0) + 1
49+
50+
# ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ๊ณ ์œ  ๋ฌธ์ž์˜ ๊ฐœ์ˆ˜
51+
required = len(t_count)
52+
53+
# ์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ์˜ ์™ผ์ชฝ, ์˜ค๋ฅธ์ชฝ ํฌ์ธํ„ฐ์™€ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ๋ฌธ์ž ๊ฐœ์ˆ˜ ์ดˆ๊ธฐํ™”
54+
left = 0
55+
right = 0
56+
57+
# ํ˜„์žฌ ์œˆ๋„์šฐ์—์„œ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ๋ฌธ์ž์˜ ๊ฐœ์ˆ˜
58+
formed = 0
59+
60+
# ํ˜„์žฌ ์œˆ๋„์šฐ์˜ ๋ฌธ์ž ๊ฐœ์ˆ˜๋ฅผ ์ €์žฅํ•˜๋Š” ํ•ด์‹œ๋งต
61+
window_counts = {}
62+
63+
# ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•  ๋ณ€์ˆ˜๋“ค
64+
min_len = float('inf')
65+
min_left = 0
66+
min_right = 0
67+
68+
# ์˜ค๋ฅธ์ชฝ ํฌ์ธํ„ฐ๋กœ ์œˆ๋„์šฐ ํ™•์žฅ
69+
while right < len(s):
70+
# ์˜ค๋ฅธ์ชฝ ๋ฌธ์ž๋ฅผ ์œˆ๋„์šฐ์— ์ถ”๊ฐ€
71+
char = s[right]
72+
window_counts[char] = window_counts.get(char, 0) + 1
73+
74+
# ํ˜„์žฌ ๋ฌธ์ž์˜ ๊ฐœ์ˆ˜๊ฐ€ t์—์„œ ์š”๊ตฌํ•˜๋Š” ๊ฐœ์ˆ˜์™€ ๊ฐ™์•„์ง€๋ฉด formed์— 1์„ ๋”ํ•จ
75+
if char in t_count and window_counts[char] == t_count[char]:
76+
formed += 1
77+
78+
# ๋ชจ๋“  ๋ฌธ์ž์˜ ์กฐ๊ฑด์ด ๋งŒ์กฑ๋˜๋ฉด ์™ผ์ชฝ ํฌ์ธํ„ฐ๋กœ ์œˆ๋„์šฐ๋ฅผ ์ตœ์†Œํ™” ์‹œ๋„
79+
while left <= right and formed == required:
80+
char = s[left]
81+
82+
# ํ˜„์žฌ ์œˆ๋„์šฐ๊ฐ€ ์ง€๊ธˆ๊นŒ์ง€์˜ ์ตœ์†Œ ๊ธธ์ด๋ณด๋‹ค ์ž‘์œผ๋ฉด ๊ฒฐ๊ณผ ์—…๋ฐ์ดํŠธ
83+
if right - left + 1 < min_len:
84+
min_len = right - left + 1
85+
min_left = left
86+
min_right = right
87+
88+
# ์™ผ์ชฝ ๋ฌธ์ž๋ฅผ ์ œ๊ฑฐํ•˜๊ณ , ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜์ง€ ์•Š๊ฒŒ ๋˜๋ฉด formed์—์„œ 1์„ ๋บŒ
89+
window_counts[char] -= 1
90+
if char in t_count and window_counts[char] < t_count[char]:
91+
formed -= 1
92+
93+
# ์™ผ์ชฝ ํฌ์ธํ„ฐ ์ด๋™
94+
left += 1
95+
96+
# ์˜ค๋ฅธ์ชฝ ํฌ์ธํ„ฐ ์ด๋™
97+
right += 1
98+
99+
# ๊ฒฐ๊ณผ ๋ฐ˜ํ™˜
100+
return "" if min_len == float('inf') else s[min_left:min_right + 1]
101+
102+
103+

0 commit comments

Comments
ย (0)