Skip to content

Commit 7740c13

Browse files
author
แ„‹แ…ตแ„‹แ…งแ†ซแ„‰แ…ฎ
committed
decode ways
1 parent c2e5272 commit 7740c13

File tree

1 file changed

+83
-0
lines changed

1 file changed

+83
-0
lines changed
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
package leetcode_study
2+
3+
/*
4+
* ๋””์ฝ”๋”ฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ
5+
* ์•„๋ž˜ ํ’€์ด๋Š” ๊ตฌํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๊ตฌํ•œ ๋’ค ์˜ˆ์™ธ ์ƒํ™ฉ์„ ์ œ์™ธํ•ด ๋‹ต์„ ๊ตฌํ•˜๋Š” ํ’€์ด
6+
* ์ฃผ์–ด์ง„ ๋ฌธ์ž์—ด์„ ์žฌ๊ท€๋ฅผ ํ†ตํ•ด ๋‚˜๋ˆŒ ๋•Œ, ์ค‘๋ณต์˜ ๊ฒฝ์šฐ๋ฅผ ๋ชจ๋‘ ๊ณ„์‚ฐํ•˜๊ธฐ ๋•Œ๋ฌธ์— "Memory Limit Exceeded" ๋ฐœ์ƒ
7+
* ์˜ˆ๋ฅผ ๋“ค์–ด, ๊ธธ์ด๊ฐ€ 50์ธ ๋ฌธ์ž์—ด์— ๋Œ€ํ•ด 2^{50} ์— ๊ฐ€๊นŒ์šด ๊ฒฝ์šฐ์˜ ์ˆ˜๊ฐ€ ์ƒ์„ฑ๋  ์ˆ˜ ์žˆ์Œ.
8+
* */
9+
fun numDecodings(s: String): Int {
10+
val alphabetList = mutableListOf<String>()
11+
var answer = 0
12+
for (i in 1..26) {
13+
alphabetList.add(i.toString())
14+
}
15+
val dividedList = lengthDivider(s)
16+
17+
for (dividedElement in dividedList) {
18+
var index = 0
19+
var value = 0
20+
for (each in dividedElement) {
21+
val subString = s.substring(index, index + each)
22+
if (subString.first() != '0' && alphabetList.contains(subString)) {
23+
index += each
24+
value += 1
25+
}
26+
}
27+
if (value == dividedElement.size) {
28+
answer += 1
29+
}
30+
}
31+
return answer
32+
}
33+
34+
fun lengthDivider(s: String): List<List<Int>> {
35+
val result = mutableListOf<List<Int>>()
36+
37+
fun divide(target: Int, current: List<Int>) {
38+
if (target == 0) {
39+
result.add(current)
40+
return
41+
}
42+
if (target < 0) return
43+
44+
divide(target - 1, current + 1)
45+
divide(target - 2, current + 2)
46+
}
47+
48+
divide(s.length, emptyList())
49+
return result
50+
}
51+
52+
/*
53+
* ๋ฉ”๋ชจ์ด์ œ์ด์…˜์„ ์‚ฌ์šฉํ•œ ๋ฌธ์ œ ํ•ด๊ฒฐ
54+
* ์‹œ๊ฐ„ ๋ณต์žก๋„: O(n)
55+
* -> ์ฃผ์–ด์ง„ ๋ฌธ์ž์—ด์˜ ๊ธธ์ด ๋งŒํผ ์ˆœํšŒ
56+
* ๊ณต๊ฐ„ ๋ณต์žก๋„: O(1)
57+
* -> ์ฃผ์–ด์ง„ ๊ธธ์ด ๋งŒํผ ๊ธฐ์กด ์ •๋ณด๋ฅผ '๋ฉ”๋ชจ'ํ•  ์ˆ˜ ์žˆ๋Š” ๊ณต๊ฐ„
58+
* */
59+
fun numDecodings(s: String): Int {
60+
if (s.isEmpty() || s.first() == '0') return 0 // ๋นˆ ๋ฌธ์ž์—ด ๋˜๋Š” '0'์œผ๋กœ ์‹œ์ž‘ํ•˜๋Š” ๊ฒฝ์šฐ ๋””์ฝ”๋”ฉ ๋ถˆ๊ฐ€
61+
62+
val n = s.length
63+
val dp = IntArray(n + 1) // dp[i]๋Š” s[0..i-1]๊นŒ์ง€ ๋””์ฝ”๋”ฉ ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ์ €์žฅ
64+
dp[0] = 1 // ๋นˆ ๋ฌธ์ž์—ด์€ ํ•˜๋‚˜์˜ ๋ฐฉ๋ฒ•์œผ๋กœ ๋””์ฝ”๋”ฉ ๊ฐ€๋Šฅ
65+
dp[1] = if (s[0] != '0') 1 else 0 // ์ฒซ ๋ฌธ์ž๊ฐ€ '0'์ด ์•„๋‹ˆ๋ฉด ํ•œ ๊ฐ€์ง€ ๋ฐฉ๋ฒ• ๊ฐ€๋Šฅ
66+
67+
for (i in 2..n) {
68+
val oneDigit = s.substring(i - 1, i).toInt()
69+
val twoDigits = s.substring(i - 2, i).toInt()
70+
71+
// ํ•œ ์ž๋ฆฌ ์ˆซ์ž๊ฐ€ ์œ ํšจํ•œ ๊ฒฝ์šฐ
72+
if (oneDigit in 1..9) {
73+
dp[i] += dp[i - 1]
74+
}
75+
76+
// ๋‘ ์ž๋ฆฌ ์ˆซ์ž๊ฐ€ ์œ ํšจํ•œ ๊ฒฝ์šฐ
77+
if (twoDigits in 10..26) {
78+
dp[i] += dp[i - 2]
79+
}
80+
}
81+
82+
return dp[n]
83+
}

0 commit comments

Comments
ย (0)