|
| 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