읽기 전
- 불필요한 코드나 잘못 작성된 내용에 대한 지적은 언제나 환영합니다.
- 개인적으로 배운 점을 정리한 글입니다.
문제 링크
문제 풀이
dp로 풀 수 있겠다는 생각은 들었지만 제약조건 체크에 너무 많은 시간을 쏟아버렸다. 제약 조건을 체크하는 문제가 최근 코테에 빈번히 출제된다는 점에서 좋은 문제라 생각한다. 현재 자리에 대해 유효성 검증과 앞자리와 결합하여 2자리로 만들 수 있는지 여부가 중요하다.
- 현재 자리가 0일 경우
- 앞 자리가 1이나 2라면 앞자리를 포함한 두 자리로 구성해야 하므로 i - 2째 자리의 가짓수와 동일
- 앞 자리가 1이나 2가 아니라면 유효하지 않으므로 0 반환
- 현재 자리가 0이 아닌 경우
- 앞 자리가 1이면 현재 자리도 유효하고 앞자리와 결합하여 두 자리로도 구성이 가능하므로 i - 2위치와 i - 1 위치의 가짓수를 더한 값이다.(i -2는 두 자리 수로 구성했을 때, i - 1은 한 자리 수로 구성했을 때)
- 앞 자리가 2라면 1부터 6까지인지 확인하여 포함되면 i - 2와 i - 1번째 가짓수를 더한 값
- 그 외엔 두 자리 구성이 불가하므로 i - 1과 동일
python 코드
class Solution:
def numDecodings(self, s: str) -> int:
if s[0] == "0":
return 0
elif len(s) == 1:
return 1
dp = [0] * len(s)
dp[0] = 1
char = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]
if s[1] == "0":
if s[0] in char[1:3]:
dp[1] = dp[0]
else:
return 0
else:
if s[0] == "1":
dp[1] = 2
elif s[0] == "2" and s[1] in char[1:7]:
dp[1] = 2
else:
dp[1] = dp[0]
if len(s) > 1:
for i, c in enumerate(s[2:], 2):
if s[i] == "0":
if s[i - 1] in char[1:3]:
dp[i] = dp[i - 2]
else:
return 0
else:
if s[i - 1] == "1":
dp[i] = dp[i - 2] + dp[i - 1]
elif s[i - 1] == "2" and s[i] in char[1:7]:
dp[i] = dp[i - 2] + dp[i - 1]
else:
dp[i] = dp[i - 1]
return dp[-1]
'Algorithms > LeetCode' 카테고리의 다른 글
LeetCode #1976 Number of Ways to Arrive at Destination (0) | 2021.08.24 |
---|---|
LeetCode #1339 Maximum Product of Splitted Binary Tree (0) | 2021.08.24 |
LeetCode #1969 Minimum Non-Zero Product of the Array Elements (0) | 2021.08.21 |
LeetCode #1968 Array With Elements Not Equal to Average of Neighbors (0) | 2021.08.21 |
LeetCode #1964 Find the Longest Valid Obstacle Course at Each Position (0) | 2021.08.12 |