|
| 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