Leetcode Java Decode Ways
업데이트:
문제
코드
class Solution {
public int numDecodings(String s) {
int[] dp = new int[s.length() + 1];
dp[s.length()] = 1;
dp[s.length() - 1] = s.charAt(s.length() - 1) != '0' ? 1 : 0;
for (int idx = s.length() - 2; idx >= 0; idx--) {
if (s.charAt(idx) != '0') {
dp[idx] = dp[idx + 1] + (Integer.parseInt(s.substring(idx, idx + 2)) <= 26 ? dp[idx + 2] : 0);
}
}
return dp[0];
}
}
결과
설명
- 숫자로 이루어진 주어진 문자열 s를 이용하여 아래의 규칙으로 만들 수 있는 문자열 조합에 대한 경우의 수를 구하는 문제이다.
- 각 문자는 숫자랑 치환이 된다. (‘A’ = “1”, ‘B’ = “2”, …, ‘Z’ = “26”)
- 주어진 문자열 s가 “26”일 경우 “2” + “6” = ‘B’ + ‘F’, “26” = ‘Z’로 두 조합으로 구성이 가능하다.
-
변수 dp를 주어진 문자열 s의 길이 + 1만큼의 크기인 정수 배열로 정의한다.
- 정수 배열 dp의 초기 값을 설정한다.
- dp[s.length()]에는 1을 넣어준다.
- dp[s.length() - 1]에는 주어진 문자열 s의 마지막 문자가 ‘0’이 아닐 경우 1을, ‘0’일 경우 0을 넣어준다.
- 문자열을 역순으로 모두 반복하여 문자열 조합에 대한 경우의 수를 구한다.
- 문자가 ‘0’이 아닌 경우 dp[i]에 dp[i + 1]의 값과 두 자리의 문자열이 26 이하인지 확인하여 26 이하일 경우 dp[i + 2] 값을 합쳐 넣어준다.
- 문자가 ‘0’이 나올 경우, 해당 문자 숫자열 치환이 불가능하므로 무시한다.
- 반복이 완료되면 주어진 문자열 s의 첫 문자까지 확인하여 경우의 수를 산정한 dp[0]를 주어진 문제의 결과로 반환한다.
소스
Sample Code는 여기에서 확인 가능합니다.
댓글남기기