# 연관 링크
- [문제 풀이 스케줄](https://github.com/orgs/DaleStudy/projects/6/views/5)
- [답안 코드 제출법](https://github.com/DaleStudy/leetcode-study/wiki/%EB%8B%B5%EC%95%88-%EC%A0%9C%EC%B6%9C-%EA%B0%80%EC%9D%B4%EB%93%9C)

# Problem
- 문제 링크 : http://leetcode.com/problems/decode-ways/
- 문제 이름 : Decode ways
- 문제 번호 : 91
- 난이도 : medium
- 카테고리 : DFS, DP

# 문제 설명


# 아이디어
- 어떤 방법으로 접근했는지 서술
- 포스 vs 최적화 아이디어 차이 등
- 잡도에 대한 고려

# ✅ 코드 (Solution)

## DFS(Memory Limit Exceeded)
```cpp
class Solution {
int cnt;
public:
    bool canBeDecoded(vector<char> st){
        if(st.size()>2){
            return false;
        }else if(st.size()==1){
            return st[0]!='0';
        }
        //st.size()==2

        if(st[0]=='1'){
            return true;
        }else if(st[0]=='2'){
           return (int)(st[1]-'0') <= 6;
        }else{
            return false;
        }
    }

    void helper(string s, int idx){
        if(idx==s.size()){
            cnt++;
            return;
        }else if(idx>s.size()){
            return;
        }
        if(canBeDecoded(vector<char>(s.begin()+idx, s.begin()+idx+1))){
            helper(s, idx+1);
        }

        if(idx+2<=s.size() && canBeDecoded(vector<char>(s.begin()+idx, s.begin()+idx+2))){
            helper(s, idx+2);
        }
    }

    int numDecodings(string s) {
        cnt = 0;
        helper(s, 0);
        return cnt;        
    }
};
```
- 단순 DFS 풀이
- Memory Limit Exceeded(Heap 메모리 초과) 발생

## DP

```cpp
class Solution {
public:
    int numDecodings(string s) {  
        vector<int> dp = vector<int>(s.size()+1, -1);
        return helper(s, 0, dp);
    }

    int helper(string s, int idx, vector<int>& dp){
        if(s.size()==idx){
            return 1;
        }
        if(s[idx]=='0'){
            return 0;
        }

        if(dp[idx]!=-1){
            return dp[idx];
        }

        int res = helper(s, idx+1, dp);

        if(idx+1<s.size()){
            int num = stoi(s.substr(idx, 2));
            if(num>=10 && num <= 26){
                res += helper(s, idx+2, dp);
            }

        }
        return dp[idx] = res;

    }
};
```

- dp
- 메모이제이션
- stoi / substr 멤버 함수 사용하여 decode 함수 간략화


# 최적화 포인트 (Optimality Discussion)
- 메모이제이션
- stoi / substr 멤버 함수 사용하여 decode 함수 간략화

# 🧪 테스트 & 엣지 케이스

# 📚 관련 지식 복습
- 메모이제이션
- stl(stoi / substr 등)

# 🔁 회고


