forked from DaleStudy/leetcode-study
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy paththispath98.py
69 lines (59 loc) ยท 2.35 KB
/
thispath98.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
class Solution:
def numDecodings(self, s: str) -> int:
"""
Intuition:
๋ฌธ์๋ฅผ ์ชผ๊ฐ์ ๋์ฝ๋ ์กฐํฉ์ ์ป๋๋ค.
์ดํ, ๋์ฝ๋ ์กฐํฉ์์ 2๊ฐ์ฉ ๋ฌถ์ ๊ฒฝ์ฐ 26๋ณด๋ค ํฐ ์๊ฐ ์์ ์ ์์ผ๋ฏ๋ก
๋ค์ ํ๋ฒ ์ชผ๊ฐ ๋ค.
๋ง์ง๋ง์ผ๋ก ๊ฐ ๋์ฝ๋ ์กฐํฉ์์ ๊ฐ์ ์ป๋ ๊ฒฝ์ฐ๋
ํผ๋ณด๋์น ์์ด์ ๋ฐ๋ฅธ๋ค.
Time Complexity:
O(N):
๋ฌธ์๋ฅผ ์ชผ๊ฐ๊ณ , ๋ฌถ๋ ๋ฌธ์ ์กฐํฉ์ ๊ตฌํ๊ณ ,
ํผ๋ณด๋์น ์์ด์์ ๊ฐ์ ์ฐพ๋ ๊ฒ์ ๋ชจ๋ O(N)๋งํผ ์์๋๋ค.
Space Complexity:
O(1):
์ต์
์ ๊ฒฝ์ฐ N๊ฐ์ ๋ํ ํผ๋ณด๋์น ์์ด์ ๊ตฌํด์ผ ํ๊ณ ,
N์ ์ต๋ 100์ด๋ฏ๋ก O(1)์ด๋ค.
"""
if s[0] == "0":
return 0
# ๋ฌธ์์ด์์ 0 ์์ 1 ํน์ 2๊ฐ ๋ถ๋์ง ํ์ธ
# ๊ทธ๋ ์ง ์๋ค๋ฉด, ๋์ฝ๋ ํ ์ ์์ผ๋ฏ๋ก return 0
# O(N)
splitted_s = []
start = 0
for i in range(len(s)):
if s[i] == "0":
if s[i - 1] in "12":
splitted_s.append(s[start: i - 1])
start = i + 1
else:
return 0
splitted_s.append(s[start:])
# ์ชผ๊ฐ์ง ๋ฌธ์์์ ๋ ๋ฌธ์๋ฅผ ๋ณด๊ณ , ๋ฌถ์ ์ ์๋์ง
# (26 ์ดํ์ธ์ง)๋ฅผ ํ์ธํ๋ค.
# ๋ฌถ์ ์ ์๋ค๋ฉด, ๋ฌธ์๋ฅผ ๋ค์ ํ๋ฒ ์ชผ๊ฐ ๋ค.
# O(N)
interval = []
for splitted in splitted_s:
start = 0
for i in range(1, len(splitted)):
if int(splitted[i - 1: i + 1]) > 26:
interval.append(i - start)
start = i
interval.append(len(splitted) - start)
answer = 1
fib_dict = {0: 1, 1: 1, 2: 2}
def get_fib(n):
if n not in fib_dict:
fib_dict[n] = get_fib(n - 1) + get_fib(n - 2)
return fib_dict[n]
# ์ชผ๊ฐ์ง ๋ฌธ์์์ ๋์ฝ๋ ์กฐํฉ์
# ๋ฌธ์ ๊ฐ์๋ฅผ ํผ๋ณด๋์น ์์ด์ ๋ฃ์ ๊ฐ์ด๋ค.
# ์ด ๊ฐ๋ค์ ์ชผ๊ฐ์ง ๋ฌธ์๋ค์ ๋ํ์ฌ ๊ณฑ์
์ผ๋ก ๊ณ์ฐ๋๋ค.
# O(N)
get_fib(max(interval))
for n in interval:
answer *= fib_dict[n]
return answer