Skip to content

Commit 0dff36a

Browse files
committed
add solution: decode-ways
1 parent 03ff9c5 commit 0dff36a

File tree

1 file changed

+85
-0
lines changed

1 file changed

+85
-0
lines changed

β€Ždecode-ways/ZetBe.pyβ€Ž

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
'''
2+
문제: 숫자둜 이루어진 λ¬Έμžμ—΄μ΄ μ£Όμ–΄μ‘Œμ„ λ•Œ, 이λ₯Ό μ•ŒνŒŒλ²³μœΌλ‘œ λ””μ½”λ”©ν•˜λŠ” λ°©λ²•μ˜ 수λ₯Ό κ΅¬ν•˜λŠ” 문제(μ—¬κΈ°μ„œ 1은 'A', 2λŠ” 'B', ..., 26은 'Z'에 ν•΄λ‹Ή).
3+
풀이: 동적 κ³„νšλ²•μ„ μ‚¬μš©ν•˜μ—¬ 각 μœ„μΉ˜κΉŒμ§€μ˜ λ””μ½”λ”© λ°©λ²•μ˜ 수λ₯Ό 계산
4+
1. dp[i]λ₯Ό λ¬Έμžμ—΄μ˜ i번째 λ¬ΈμžκΉŒμ§€ λ””μ½”λ”©ν•˜λŠ” λ°©λ²•μ˜ 수라고 μ •μ˜
5+
2. λ¬Έμžμ—΄μ˜ i번째 λ¬Έμžκ°€ '0'인 경우, 이전 λ¬Έμžκ°€ '1' λ˜λŠ” '2'인 κ²½μš°μ—λ§Œ μœ νš¨ν•œ 디코딩이 κ°€λŠ₯ν•˜λ―€λ‘œ dp[i] = dp[i-2]
6+
3. λ¬Έμžμ—΄μ˜ i번째 λ¬Έμžμ™€ 이전 문자λ₯Ό ν•©μ³μ„œ 10~26 μ‚¬μ΄μ˜ μˆ«μžκ°€ λ˜λŠ” 경우, dp[i] = dp[i-1] + dp[i-2]
7+
4. κ·Έ μ™Έμ˜ κ²½μš°μ—λŠ” dp[i] = dp[i-1]
8+
μ‹œκ°„λ³΅μž‘λ„: O(n)
9+
λ¬Έμžμ—΄μ„ ν•œ 번 μˆœνšŒν•˜λ©° dp 배열을 μ±„μš°λ―€λ‘œ 전체 μ‹œκ°„λ³΅μž‘λ„λŠ” O(n)이닀.
10+
κ³΅κ°„λ³΅μž‘λ„: O(n)
11+
dp 배열을 μ‚¬μš©ν•˜λ―€λ‘œ 전체 κ³΅κ°„λ³΅μž‘λ„λŠ” O(n)이닀.
12+
μ‚¬μš©ν•œ 자료ꡬ쑰: 리슀트
13+
'''
14+
15+
16+
class Solution:
17+
def numDecodings(self, s: str) -> int:
18+
string = list(s)
19+
n = len(string)
20+
dp = [0 for i in range(n)]
21+
if string[0] == '0':
22+
return 0
23+
if n == 1:
24+
return 1
25+
if n == 2:
26+
if 11 <= int(s) <= 19 or 21 <= int(s) <= 26:
27+
return 2
28+
elif int(s) == 10 or int(s) == 20:
29+
return 1
30+
elif '0' in string:
31+
return 0
32+
else:
33+
return 1
34+
dp[0] = 1
35+
if string[1] == '0' and 3 <= int(string[0]):
36+
return 0
37+
if 11 <= int(string[0])*10 + int(string[1]) <= 19 or 21 <= int(string[0])*10 + int(string[1]) <= 26:
38+
dp[1] = 2
39+
else:
40+
dp[1] = 1
41+
42+
for i in range(2, n):
43+
if string[i] == '0' and (3 <= int(string[i-1]) or int(string[i-1]) == 0):
44+
return 0
45+
if 11 <= int(string[i-1])*10 + int(string[i]) <= 19 or 21 <= int(string[i-1])*10 + int(string[i]) <= 26:
46+
dp[i] = dp[i-2] + dp[i-1]
47+
elif int(string[i-1])*10 + int(string[i]) == 10 or int(string[i-1])*10 + int(string[i]) == 20:
48+
dp[i] = dp[i-2]
49+
else:
50+
dp[i] += dp[i-1]
51+
52+
return dp[n-1]
53+
54+
55+
'''
56+
λ„ˆλ¬΄ λ³΅μž‘ν•˜κ²Œ ν’€μ—ˆκΈ° λ•Œλ¬Έμ— aiμ—κ²Œ κ°„κ²°ν•œ 풀이λ₯Ό μ•Œλ €λ‹¬λΌν•΄μ„œ κ³΅μœ λ“œλ¦½λ‹ˆλ‹€
57+
58+
class Solution:
59+
def numDecodings(self, s: str) -> int:
60+
if not s or s[0] == '0':
61+
return 0
62+
63+
n = len(s)
64+
# dp[i] : s의 μ•ž iκΈ€μžλ₯Ό ν•΄μ„ν•˜λŠ” λ°©λ²•μ˜ 수
65+
dp = [0] * (n + 1)
66+
67+
# μ΄ˆκΈ°κ°’ μ„€μ • (빈 λ¬Έμžμ—΄μ€ 1κ°€μ§€ 방법, 첫 κΈ€μžλŠ” μœ„μ—μ„œ 0체크 ν–ˆμœΌλ―€λ‘œ 1κ°€μ§€)
68+
dp[0] = 1
69+
dp[1] = 1
70+
71+
for i in range(2, n + 1):
72+
# 1. ν•œ 자리 숫자 해석 (1~9)
73+
# ν˜„μž¬ 숫자(s[i-1])κ°€ '0'이 μ•„λ‹ˆλ©΄, 이전 μƒνƒœ(dp[i-1])λ₯Ό κ³„μŠΉ
74+
if s[i-1] != '0':
75+
dp[i] += dp[i-1]
76+
77+
# 2. 두 자리 숫자 해석 (10~26)
78+
# 이전 μˆ«μžμ™€ ν˜„μž¬ 숫자λ₯Ό ν•©μ³μ„œ 10~26 사이라면, μ „μ „ μƒνƒœ(dp[i-2])λ₯Ό 더함
79+
two_digit = int(s[i-2 : i])
80+
if 10 <= two_digit <= 26:
81+
dp[i] += dp[i-2]
82+
83+
return dp[n]
84+
'''
85+

0 commit comments

Comments
Β (0)