Skip to content

Commit fade13e

Browse files
committed
feat: decode-ways 풀이 추가
1 parent e849508 commit fade13e

File tree

1 file changed

+66
-0
lines changed

1 file changed

+66
-0
lines changed

decode-ways/unpo88.py

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
class Solution:
2+
def numDecodings(self, s: str) -> int:
3+
# 예외 처리: "0"으로 시작하면 불가능
4+
if not s or s[0] == '0':
5+
return 0
6+
7+
n = len(s)
8+
dp = [0] * (n + 1)
9+
10+
# 초기값
11+
dp[0] = 1 # 빈 문자열
12+
dp[1] = 1 # 첫 번째 문자 (이미 "0" 체크함)
13+
14+
for i in range(2, n + 1):
15+
# 한 자리 숫자 (1~9)
16+
if s[i-1] != '0':
17+
dp[i] += dp[i-1]
18+
19+
# 두 자리 숫자 (10~26)
20+
two_digit = int(s[i-2:i])
21+
if 10 <= two_digit <= 26:
22+
dp[i] += dp[i-2]
23+
24+
return dp[n]
25+
26+
27+
"""
28+
================================================================================
29+
풀이 과정
30+
================================================================================
31+
- "226" → 2|2|6 (BBF), 22|6 (VF), 2|26 (BZ) → 3가지 방법 존재
32+
- DP를 이용해서 각 위치에서 가능한 디코딩 경우의 수를 계산
33+
- 한 자리(1~9)와 두 자리(10~26) 숫자를 고려하여 누적
34+
35+
[1차 시도]
36+
────────────────────────────────────────────────────────────────────────────────
37+
1. 접근 방법
38+
- DP 배열 사용: dp[i] = 문자열의 처음부터 i번째까지의 디코딩 경우의 수
39+
- 각 위치에서 한 자리 숫자(1~9)로 디코딩 가능하면 dp[i-1] 더하기
40+
- 두 자리 숫자(10~26)로 디코딩 가능하면 dp[i-2] 더하기
41+
42+
2. 구현
43+
n = len(s)
44+
dp = [0] * (n + 1)
45+
46+
# 초기값 설정
47+
dp[0] = 1 # 빈 문자열
48+
dp[1] = 1 # 첫 번째 문자 (0이 아니면 1가지)
49+
50+
for i in range(2, n + 1):
51+
# 한 자리 숫자 (1~9)
52+
if s[i-1] != '0':
53+
dp[i] += dp[i-1]
54+
55+
# 두 자리 숫자 (10~26)
56+
two_digit = int(s[i-2:i])
57+
if 10 <= two_digit <= 26:
58+
dp[i] += dp[i-2]
59+
60+
3. 예외 처리
61+
- "0"으로 시작하는 문자열은 디코딩 불가능 → 0 반환
62+
- 빈 문자열 체크
63+
64+
4. 시간 복잡도: O(n) - 문자열을 한 번만 순회
65+
5. 공간 복잡도: O(n) - DP 배열 사용
66+
"""

0 commit comments

Comments
 (0)