๋์ด๋: Medium
ํค์๋: DP
๐ ๋ฌธ์
์ํ๋ฒณ A-Z์ ๋ฌธ์๋ก ์ด๋ฃจ์ด์ง ๋ฉ์์ง๋ ๋ค์ ๋งคํ์ ์ฌ์ฉํ์ฌ ์ซ์๋ก ์ธ์ฝ๋ฉ๋ ์ ์์ต๋๋ค:
'A' -> "1"
'B' -> "2"
...
'Z' -> "26"
์ธ์ฝ๋ฉ๋ ๋ฉ์์ง๋ฅผ ๋์ฝ๋ฉํ๋ ค๋ฉด, ๋ชจ๋ ์ซ์๋ฅผ ๊ทธ๋ฃนํํ๊ณ ์์ ๋งคํ์ ๋ฐ๋๋ก ์ฌ์ฉํ์ฌ ๋ค์ ๋ฌธ์๋ก ๋งคํํด์ผ ํฉ๋๋ค (์ฌ๋ฌ ๋ฐฉ๋ฒ์ด ์์ ์ ์์). ์๋ฅผ ๋ค์ด, "11106"์ ๋ค์๊ณผ ๊ฐ์ด ๋งคํ๋ ์ ์์ต๋๋ค:
(1 1 10 6)์ ๊ทธ๋ฃนํํ์ฌ "AAJF"
(11 10 6)์ ๊ทธ๋ฃนํํ์ฌ "KJF"
(1 11 06)์ ๊ทธ๋ฃนํํ๋ ๊ฒ์ "06"์ 'F'๋ก ๋งคํํ ์ ์์ผ๋ฏ๋ก ์๋ชป๋ ๊ฒ์์ ์ ์ํ์ธ์.
์ซ์๋ง ํฌํจํ๋ ๋ฌธ์์ด s๊ฐ ์ฃผ์ด์ก์ ๋, ์ด๋ฅผ ๋์ฝ๋ฉํ๋ ๋ฐฉ๋ฒ์ ์๋ฅผ ๋ฐํํ์ธ์.
ํ
์คํธ ์ผ์ด์ค๋ ๋ต์ด 32๋นํธ ์ ์์ ๋ง๋๋ก ์์ฑ๋ฉ๋๋ค.
๋ฌธ์ ์๋ฌธ: https://leetcode.com/problems/decode-ways/description/
๐ ์ ์ถ๋ ฅ ์์
Example 1:
Input: s = "12"
Output: 2
Explanation: "12" could be decoded as "AB" (1 2) or "L" (12).
Example 2:
Input: s = "226"
Output: 3
Explanation: "226" could be decoded as "BZ" (2 26), "VF" (22 6), or "BBF" (2 2 6).
Example 3:
Input: s = "06"
Output: 0
Explanation: "06" cannot be mapped to "F" because of the leading zero ("6" is different from "06").
๐ ๋ฌธ์ ํ์ด
ํด๋น ๋ฌธ์ ๋ string์ n ๋ฒ์งธ ์ซ์๊น์ง์ decoding ๊ฐ๋ฅํ ๊ฒฝ์ฐ์ ์๋ฅผ ๊ตฌํ๋ ๋ฐ์ ์์ n-1, n-2 ๊น์ง์ ๊ฒฝ์ฐ์ ์๋ฅผ ๊ฐ์ง๊ณ ๊ตฌํ ์ ์๋ค๋ ์ ์์ dynamic programming (DP)๋ฅผ ์ฌ์ฉํด์ ๋ฌธ์ ๋ฅผ ํ ์ ์๋ค.
์๋ฅผ ๋ค์ด, a[n]์ n ๋ฒ์งธ ์๋ฆฌ์ string ๊น์ง์ decoding ๊ฐ๋ฅํ ๊ฒฝ์ฐ์ ์๋ผ๊ณ ์ ์ํ๋ค๊ณ ํ๋ฉด a[n]์ ์กฐ๊ฑด๋ถ์ ์ผ๋ก a[n-2] + a[n-1]๋ก ๊ตฌํ ์ ์๋ค. ์ด ๋, ๊ฐ ์กฐ๊ฑด์ ๋ค์๊ณผ ๊ฐ๋ค. code[n-1], code[n]์ผ๋ก ๋ ์๋ฆฌ ์ฝ๋๋ฅผ ๋ง๋ค ์ ์๋ค๊ณ ํ๋ค๋ฉด n-2๊น์ง๋ง์ผ๋ก ๋ง๋ค ์ ์๋ ์ฝ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ๊ทธ๋๋ก ๊ฐ์ ธ์ฌ ์ ์๋ค. ๋ ํํธ์ผ๋ก code[n]์ด 0์ด ์๋๋ผ๋ฉด ํ ์๋ฆฌ ์๋ง์ผ๋ก๋ ์ฝ๋๊ฐ ๋ ์ ์๊ธฐ ๋๋ฌธ์ a[n-1] ๊น์ง ๋ง๋ค ์ ์๋ ์ฝ๋๋ ๊ฒฝ์ฐ์ ์๋ฅผ ๊ทธ๋๋ก ๊ฐ์ ธ์ฌ ์ ์๋ค.
์ด๋ฅผ ์ฝ๋๋ก ์ฎ๊ธฐ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
Runtime 0 ms: Beats 100.00 % of users with c++
Memory: 7.37 MB Beats 96.92 % of users with c++
#define num(x) (int(x)-48)
#define nums(x,y) num(x)*10+num(y)
class Solution {
public:
int numDecodings(string s) {
const int N = s.size();
vector<int> a(N, 0);
if(num(s[0])== 0)
return 0;
if(N == 1)
return 1;
// baseline initialization
// a[0]
a[0] = 1;
// a[1]
if(num(s[1]) == 0)
a[1] = ((nums(s[0],s[1]) >= 10) && (nums(s[0],s[1])<= 26))? a[0] : 0;
else
a[1] = ((nums(s[0],s[1]) >= 10) && (nums(s[0],s[1])<= 26))? a[0] + 1: a[0];
// a[n]
for(int n = 2; n < N; ++n){
a[n] = a[n-2] * (int)((nums(s[n-1],s[n]) >= 10 && nums(s[n-1],s[n]) <= 26) && num(s[n-1] != 0)) + a[n-1] * (int)(num(s[n]) != 0);
}
return a[N-1];
}
};
'IN DEPTH CAKE > Supercoder' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[c++/LeetCode-DP] 746. Min Cost Climbing Stairs (1) | 2024.05.06 |
---|---|
[c++/LeetCode-DP] 70. Climbing Stairs (1) | 2024.05.06 |
[c++/LeetCode-Hash Table] 939. Minimum Area Rectangle (1) | 2024.05.05 |
[c++/LeetCode-Hash Table] 692. Top K Frequent Words (1) | 2024.05.05 |
[c++/LeetCode-Hash Table] 387. First Unique Character in a String (1) | 2024.05.05 |