File tree Expand file tree Collapse file tree 1 file changed +66
-0
lines changed
Expand file tree Collapse file tree 1 file changed +66
-0
lines changed Original file line number Diff line number Diff line change 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+ """
You can’t perform that action at this time.
0 commit comments