๐ฅ๏ธย ์์ํ๋ฉฐ
1๏ธโฃย ๋ฌธ์ ์ ๊ทผ๋ฒ
์ด ์ ๊ท ํํ์ ๋งค์นญ ๋ฌธ์ ๋ ์ฃผ์ด์ง ๋ฌธ์์ด
s
์ ํจํด p
๊ฐ ์ฃผ์ด์ง ๊ท์น(.
๊ณผ *
)์ ๋ฐ๋ผ ์ ์ฒด์ ์ผ๋ก ์ผ์นํ๋์ง๋ฅผ ํ๋จํ๋ ๋ฌธ์ ๋ค. ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์๋ ๋ฌธ์์ด๊ณผ ํจํด์ ๋ชจ๋ ๊ฐ๋ฅํ ๋ถ๋ถ ์กฐํฉ์ ๊ณ ๋ คํด์ผ ํ๋ค.์ฒ์์๋ ๊ตฌํ์ผ๋ก ์๊ฐํ์ง๋ง, ์ง์ ๋๋ฒ๊น
ํ๋ฉฐ ์ผ์ด์ค๋ฅผ ๋ฐ์ ธ๋ณด๋ ๋๋ฌด ๋ง์ ์ผ์ด์ค๊ฐ ๋์ ๊ตฌํ๋ฒ์ด ์๋ ์ถ์๋ค. ์์งํ ๋์ ๊ณํ๋ฒ์ด๋ผ๊ณ ๋ ์ฌ๋ฆฌ๊ธฐ ์ฝ์ง ์์๋ค. ์๋ ํน์ง์ ๋ค์ ํ๋ฒ ์์งํ์.
๐กย ๋์ ๊ณํ๋ฒ ์์ง
- ๋ฌธ์ ๋ฅผ ํ์ ๋ฌธ์ ๋ก ๋ถํ ํ๊ธฐ
์ด๋ค ๋ฌธ์ ๋ฅผ DP๋ก ์ ๊ทผํ๊ธฐ ์ํด์๋ ๋ฌธ์ ๋ฅผ ์์ฐ์ค๋ฝ๊ฒ ๋ ์์ ๋ฌธ์ ๋ก ๋๋ ์ ์์ด์ผ ํ๋ค. ์ด ๋ฌธ์ ์ ๊ฒฝ์ฐ, ๋ฌธ์์ด๊ณผ ํจํด์ ๋ถ๋ถ ๋ฌธ์์ด์ ๋ํ ์ผ์น ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํจ์ผ๋ก์จ ๋ฌธ์ ๋ฅผ ๋ถํ ํ ์ ์๋ค.
- ์ํ ์ ์ด ์ดํดํ๊ธฐ
๊ฐ ์ํ(
dp[i][j]
)๊ฐ ์ด์ ์ํ๋ค๊ณผ ์ด๋ป๊ฒ ์ฐ๊ฒฐ๋๋์ง๋ฅผ ์ดํดํ๋ ๊ฒ์ด ์ค์ํ๋ค. ์ด๋ ์ ํ์์ ์ ๋ํ๋ ํต์ฌ ๋จ๊ณ๋ค.- ์ค๋ณต ๊ณ์ฐ ์ต์ํ
DP์ ๋ชฉ์ ์ค ํ๋๋ ๋์ผํ ํ์ ๋ฌธ์ ๋ฅผ ์ฌ๋ฌ ๋ฒ ๊ณ์ฐํ์ง ์๋ ๊ฒ์ด๋ค. ์ด๋ฅผ ์ํด ํ
์ด๋ธ์ ์ฌ์ฉํ์ฌ ์ด๋ฏธ ๊ณ์ฐํ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ๊ณ ์ฌ์ฌ์ฉํ๋ค.
- ๋ฌธ์ ์ ํน์ ์กฐ๊ฑด ์ฒ๋ฆฌ
ํน์ ๋ฌธ์(
.
๊ณผ *
)์ ๋์ ๋ฐฉ์์ ์ ํํ ์ดํดํ๊ณ , ์ด๋ฅผ ์ ํ์์ ๋ฐ์ํ๋ ๊ฒ์ด ์ค์ํ๋ค.2๏ธโฃย ์ ํ์, ๊ธฐ์ ์กฐ๊ฑด ์ค์
์ ํ์์ DP์์ ๊ฐ ์ํ๊ฐ ์ด์ ์ํ๋ค๊ณผ ์ด๋ป๊ฒ ์ฐ๊ด๋๋์ง๋ฅผ ๋ํ๋ด๋ ๊ท์น์ผ๋ก ,๋์ ๊ณํ๋ฒ์ผ๋ก ํด๊ฒฐํ๋ ์๊ณ ๋ฆฌ์ฆ์ ํต์ฌ์ด๋ค.
- DP ํ ์ด๋ธ ์ ์
dp[i][j]
๋ ๋ฌธ์์ด s
์ ์ฒ์ i
๋ฌธ์(s[0..i-1]
)์ ํจํด p
์ ์ฒ์ j
๋ฌธ์(p[0..j-1]
)๊ฐ ์ผ์นํ๋์ง๋ฅผ ๋ํ๋ธ๋ค.- ๊ธฐ๋ณธ ์ฌ๋ก ์ค์
- ๋น ๋ฌธ์์ด๊ณผ ๋น ํจํด:
- ๋น ๋ฌธ์์ด๊ณผ ํจํด:
dp[0][0] = True
(๋น ๋ฌธ์์ด์ ๋น ํจํด๊ณผ ์ผ์นํ๊ฒ ๋๋ค. ๊ธฐ์ ์กฐ๊ฑด์ ์ค์ ํ๋ค.)ํจํด์ด
*
๋ฅผ ํฌํจํ์ฌ ๋น ๋ฌธ์์ด๊ณผ ์ผ์นํ ์ ์๋ ๊ฒฝ์ฐ๋ฅผ ๊ณ ๋ คํ๋ค. ํจํด์ด "a*"
๋๋ "a*b*"
์ธ ๊ฒฝ์ฐ๋ค. ์ด๋ฅผ ์ํด dp[0][j]
๋ฅผ ์ด๊ธฐํํ์. 3๏ธโฃย ์ ํ์ ์ ๋
๋ฌธ์์ด
s
์ ํจํด p
์ ๊ฐ ๋ฌธ์๋ฅผ ๋น๊ตํ๋ฉด์ dp[i][j]
๋ฅผ ์ฑ์๋๊ฐ๋ค. ์ฌ๊ธฐ์
i
๋ ๋ฌธ์์ด s
์ ์ธ๋ฑ์ค, j
๋ ํจํด p
์ ์ธ๋ฑ์ค๋ฅผ ๋ํ๋ธ๋ค.- ์ง์ ์ผ์น ๋๋ ์ ์ฐ์ฐ์
- ์กฐ๊ฑด:
p[j-1] == s[i-1]
๋๋p[j-1] == '.'
- ์ด๋ ํ์ฌ ํจํด ๋ฌธ์๊ฐ ๋ฌธ์์ด์ ํ์ฌ ๋ฌธ์์ ์ผ์นํ๊ฑฐ๋,
.
์ ์ฌ์ฉํ์ฌ ์ผ์นํ๋ ๊ฒฝ์ฐ๋ค.
โ
dp[i][j] = dp[i-1][j-1]
(์ง๊ด์ ์ผ๋ก ์ด์ ์ํ๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฒ์ ์ ์ ์๋ค)- ๋ณํ ์ฐ์ฐ์
- ์กฐ๊ฑด:
p[j-1] == '*'
- ์ด๋
*
๊ฐ ๋ฐ๋ก ์์ ๋ฌธ์๊ฐ 0ํ ์ด์ ๋ฐ๋ณต๋๋ ๊ฒ์ ์๋ฏธํ๋ค. *
๋ ๋ ๊ฐ์ง ์ํฉ์ ๊ณ ๋ คํ ์ ์๋ค.*
์ ๊ทธ ์์ ๋ฌธ์๋ฅผ ํจํด์์ ์ ๊ฑฐํ์ฌ ํ์ฌ ๋ฌธ์์ด๊ณผ ํจํด์ ์ด์ ์ํ๋ฅผ ๋น๊ต*
์์ ๋ฌธ์๊ฐ ํ์ฌ ๋ฌธ์์ด์ ๋ฌธ์์ ์ผ์นํ๊ฑฐ๋,.
์ธ ๊ฒฝ์ฐ- ์ด๋, ํจํด์
*
๋ฅผ ์ด์ฉํ์ฌ ๋ฌธ์์ด์ ์ด์ ๋ฌธ์๊น์ง ๋งค์นญ๋ ์ํ๋ฅผ ํ์ธ
a. 0ํ ๋ฐ์ (๋ฌธ์ ์ ๊ฑฐ):
โ
dp[i][j] = dp[i][j-2]
b. 1ํ ์ด์ ๋ฐ์ (๋ฌธ์ ๋ฐ๋ณต):
โ
dp[i][j] = dp[i][j] or dp[i-1][j]
์ข
ํฉํ๋ฉด:
if p[j-1] == '*': dp[i][j] = dp[i][j-2] if p[j-2] == s[i-1] or p[j-2] == '.': dp[i][j] = dp[i][j] or dp[i-1][j]
์ ํ์ ์์ฝ
# DP ํ ์ด๋ธ ์ฑ์ฐ๊ธฐ for i in range(1, len(s) + 1): for j in range(1, len(p) + 1): # ํ์ฌ ๋ฌธ์๊ฐ ๋งค์น๋๋ ๊ฒฝ์ฐ (๊ฐ์ ๋ฌธ์์ด๊ฑฐ๋ '.'์ธ ๊ฒฝ์ฐ) if p[j - 1] == s[i - 1] or p[j - 1] == ".": # ํ์ฌ ๋ฌธ์๊ฐ ๋งค์น๋๋ฉด, ์ด์ ์ํ์ ๋งค์น ์ฌ๋ถ๋ฅผ ๊ทธ๋๋ก ๊ฐ์ ธ์ด # ์ฆ, ํ์ฌ ๋ฌธ์๋ฅผ ์ ์ธํ ์ด์ ๊น์ง์ ๋งค์น ์ํ๋ฅผ ์ ์ง dp[i][j] = dp[i - 1][j - 1] # ํ์ฌ ํจํด ๋ฌธ์๊ฐ '*'์ธ ๊ฒฝ์ฐ elif p[j - 1] == "*": # 1. '*' ์์ ๋ฌธ์๋ฅผ ๋ฌด์ํ๋ ๊ฒฝ์ฐ (0๋ฒ ์ฌ์ฉ) # '*'์ ๊ทธ ์์ ๋ฌธ์๋ฅผ ๋ชจ๋ ๋ฌด์ํ๊ณ , ๊ทธ ์ด์ ์ํ์ ๋งค์น ์ฌ๋ถ๋ฅผ ๊ฐ์ ธ์ด dp[i][j] = dp[i][j - 2] # 2. '*' ์์ ๋ฌธ์๊ฐ ํ์ฌ ๋ฌธ์์ ๋งค์น๋๊ฑฐ๋ '.'์ธ ๊ฒฝ์ฐ if p[j - 2] == s[i - 1] or p[j - 2] == ".": # '*' ์์ ๋ฌธ์๋ฅผ ํ ๋ฒ ์ด์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ # ํ์ฌ ๋ฌธ์๋ฅผ ๋งค์น์ํค๊ณ , ์ด์ ๋ฌธ์์ด ์ํ์ ๋งค์น ์ฌ๋ถ๋ฅผ ํ์ธ # 'or' ์ฐ์ฐ์ ์ด์ ๋จ๊ณ(dp[i][j - 2])์ ํ์ฌ ๋จ๊ณ ์ค ํ๋๋ผ๋ ์ฐธ์ด๋ฉด ์ฐธ dp[i][j] = dp[i][j] or dp[i - 1][j]
๐กย ์ ํ์์ ์ง๊ด์ ์ดํด
4๏ธโฃย ์์ ๋ฅผ ํตํ ์ ํ์ ์ ์ฉ ์ดํด
์์ :
- ์
๋ ฅ:
s = "aab"
,p = "c*a*b"
- ๋ชฉํ:
dp[3][5]
์ ๊ฐ์ ๊ตฌํ๋ ๊ฒ
๋จ๊ณ๋ณ ๊ณผ์ :
- ์ด๊ธฐํ:
dp[0][0] = True
dp[0][2] = True
("c*"
๋ 0ํ ๋ฐ์)dp[0][4] = True
("c*a*"
๋ 0ํ ๋ฐ์)
- DP ํ ์ด๋ธ ์ฑ์ฐ๊ธฐ:
- ๊ฐ
dp[i][j]
๋ ์ด์ ์ํ๋ค์ ์ฐธ์กฐํ์ฌ ์ฑ์์ง๋ค. - ์๋ฅผ ๋ค์ด
dp[1][3]
("a"
vs"c*a"
)๋dp[0][2]
(""
vs"c*"
)์ ์ฐธ์กฐํ์ฌTrue
๊ฐ ๋๋ค.
ใ
ค | ๋น ๋ฌธ์ | c | * | a | * | b |
๋น ๋ฌธ์ | T | F | T | F | T | F |
a | F | F | F | T | T | F |
a | F | F | F | F | T | F |
b | F | F | F | F | F | T |
ย
โ๏ธย Python
from typing import List from itertools import zip_longest class Solution: def isMatch(self, s: str, p: str) -> bool: # DP ํ ์ด๋ธ ์ด๊ธฐํ dp = [[False] * (len(p) + 1) for _ in range(len(s) + 1)] # ๋น ๋ฌธ์์ด๊ณผ ๋น ํจํด์ ๋งค์น๋จ dp[0][0] = True # ํจํด์ด '*'๋ก ์์ํ๋ ๊ฒฝ์ฐ ์ฒ๋ฆฌ # ์ด ๊ฒฝ์ฐ ๋น ํจํด๊ณผ ๋งค์น๋ ์ ์์ for j in range(1, len(p) + 1): if p[j - 1] == "*": dp[0][j] = dp[0][j - 2] # DP ํ ์ด๋ธ ์ฑ์ฐ๊ธฐ for i in range(1, len(s) + 1): for j in range(1, len(p) + 1): # ํ์ฌ ๋ฌธ์๊ฐ ๋งค์น๋๋ ๊ฒฝ์ฐ (๊ฐ์ ๋ฌธ์์ด๊ฑฐ๋ '.'์ธ ๊ฒฝ์ฐ) if p[j - 1] == s[i - 1] or p[j - 1] == ".": # ํ์ฌ ๋ฌธ์๊ฐ ๋งค์น๋๋ฉด, ์ด์ ์ํ์ ๋งค์น ์ฌ๋ถ๋ฅผ ๊ทธ๋๋ก ๊ฐ์ ธ์ด # ์ฆ, ํ์ฌ ๋ฌธ์๋ฅผ ์ ์ธํ ์ด์ ๊น์ง์ ๋งค์น ์ํ๋ฅผ ์ ์ง dp[i][j] = dp[i - 1][j - 1] # ํ์ฌ ํจํด ๋ฌธ์๊ฐ '*'์ธ ๊ฒฝ์ฐ elif p[j - 1] == "*": # 1. '*' ์์ ๋ฌธ์๋ฅผ ๋ฌด์ํ๋ ๊ฒฝ์ฐ (0๋ฒ ์ฌ์ฉ) # '*'์ ๊ทธ ์์ ๋ฌธ์๋ฅผ ๋ชจ๋ ๋ฌด์ํ๊ณ , ๊ทธ ์ด์ ์ํ์ ๋งค์น ์ฌ๋ถ๋ฅผ ๊ฐ์ ธ์ด dp[i][j] = dp[i][j - 2] # 2. '*' ์์ ๋ฌธ์๊ฐ ํ์ฌ ๋ฌธ์์ ๋งค์น๋๊ฑฐ๋ '.'์ธ ๊ฒฝ์ฐ if p[j - 2] == s[i - 1] or p[j - 2] == ".": # '*' ์์ ๋ฌธ์๋ฅผ ํ ๋ฒ ์ด์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ # ํ์ฌ ๋ฌธ์๋ฅผ ๋งค์น์ํค๊ณ , ์ด์ ๋ฌธ์์ด ์ํ์ ๋งค์น ์ฌ๋ถ๋ฅผ ํ์ธ # 'or' ์ฐ์ฐ์ ์ด์ ๋จ๊ณ(dp[i][j - 2])์ ํ์ฌ ๋จ๊ณ ์ค ํ๋๋ผ๋ ์ฐธ์ด๋ฉด ์ฐธ dp[i][j] = dp[i][j] or dp[i - 1][j] # ์ต์ข ๊ฒฐ๊ณผ ๋ฐํ return dp[len(s)][len(p)] if __name__ == "__main__": sol = Solution() print(sol.isMatch("aab", "c*a*b"))
ย
๐ย ์๊ฐ
์.. ์ง์ง ์ค๋๋ง์ DP ๋ฌธ์ ํ์๋๋ฐ ๋๋ฌด ์ด๋ ต๋ค. ๋งํ ๊ฒ ๊ฐ๋ค.
๋๊ธ