λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

IN DEPTH CAKE/Supercoder

[c++/LeetCode-Stack] 394. Decode String

 

 

 

λ‚œμ΄λ„Medium

ν‚€μ›Œλ“œ: Stack

문제

 

μΈμ½”λ”©λœ λ¬Έμžμ—΄μ΄ 주어지면 ν•΄λ‹Ή λ¬Έμžμ—΄μ„ λ””μ½”λ”©ν•œ λ¬Έμžμ—΄μ„ λ°˜ν™˜ν•©λ‹ˆλ‹€. 인코딩 κ·œμΉ™μ€ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€: 

 

k[μΈμ½”λ”©λœ_λ¬Έμžμ—΄], μ—¬κΈ°μ„œ λŒ€κ΄„ν˜Έ λ‚΄μ˜ μΈμ½”λ”©λœ λ¬Έμžμ—΄μ΄ k번 μ •ν™•νžˆ λ°˜λ³΅λ©λ‹ˆλ‹€. 
kλŠ” μ–‘μ˜ μ •μˆ˜μž„이 λ³΄μž₯λ©λ‹ˆλ‹€.



μž…λ ₯ λ¬Έμžμ—΄μ΄ ν•­μƒ μœ νš¨ν•˜λ‹€κ³  κ°€μ •ν•  μˆ˜ μžˆμŠ΅λ‹ˆλ‹€. μΆ”가적인 κ³΅λ°±μ΄λ‚˜ λŒ€κ΄„ν˜Έκ°€ μž˜ ν˜•μ„±λ˜μ–΄ μžˆμ§€ μ•ŠμŠ΅λ‹ˆλ‹€. λ˜ν•œ μ›λ³Έ λ°μ΄ν„°μ—λŠ” μˆ«μžκ°€ ν¬ν•¨λ˜μ–΄ μžˆμ§€ μ•ŠμœΌλ©° μˆ«μžλŠ” λ°˜λ³΅ νšŸμˆ˜ kλ§Œμ„ μœ„ν•œ κ²ƒμž…λ‹ˆλ‹€. 

예λ₯Ό λ“€μ–΄, 3a λ˜λŠ” 2[4]와 같은 μž…λ ₯은 μ—†μŠ΅λ‹ˆλ‹€. ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λŠ” μΆœλ ₯의 κΈΈμ΄κ°€ ν•­μƒ 10^5λ₯Ό μ΄ˆκ³Όν•˜μ§€ μ•Šλ„둝 μƒμ„±λ©λ‹ˆλ‹€.

 

μž…λ ₯ μ˜ˆμ‹œ

 

Example 1:

Input: s = "3[a]2[bc]"
Output: "aaabcbc"

 

문제 원문: https://leetcode.com/problems/decode-string/description/

 

문제 풀이

 

- κ΄„ν˜Έκ°€ μžˆλŠ” λ¬Έμ œλŠ” 기본적으둜 stack μžλ£Œν˜•μ„ μ‚¬μš©ν•˜λ©΄ μ‰½κ²Œ ν’€ 수 μžˆλ‹€.

- κ·Έλž˜μ„œ stack을 μ‚¬μš©ν•΄μ„œ 문제λ₯Ό ν’€μ—ˆλ‹€.

- λ³„λ„μ˜ stack μžλ£Œν˜•μ„ 두지 μ•Šκ³  vector<char>λ₯Ό λ‘¬μ„œ ν’€μ—ˆλŠ”λ°, top() μ‘°νšŒλŠ” `stack.back()` 으둜, pop() μ—°μ‚°μžλŠ” `stack.erase(stack.end()-1)`둜 κ΅¬ν˜„ν•˜μ˜€λ‹€.

- μ•„μ΄λ””μ–΄λŠ” ]λ₯Ό λ§Œλ‚ λ•ŒκΉŒμ§€μ˜ 정보λ₯Ό λͺ¨λ‘ stack 에 μ €μž₯ν•˜κ³ , ]λ₯Ό λ§Œλ‚˜λ©΄ [λ₯Ό λ§Œλ‚ λ•ŒκΉŒμ§€μ˜ 정보λ₯Ό tmp_stack에 λ„£μ–΄λ‘μ—ˆλ‹€κ°€. μ΄μ–΄μ„œ λ‚˜νƒ€λ‚˜λŠ” 숫자 (이 λ•Œ, ν•œμžλ¦¬ μˆ˜κ°€ μ•„λ‹ˆκΈ° λ•Œλ¬Έμ— while 문을 가지고 숫자 N을 찾음) 만큼 λ°˜λ³΅ν•΄μ„œ stack에 넣어쀬닀.

- μ΅œμ’…μ μœΌλ‘œ stack μ•ˆμ— λ‹΄κ²¨μžˆλŠ” 값을 string으둜 λ°˜ν™˜ν•œλ‹€.

 

Runtime: 0ms Beats100.00%of users with C++
Memory: 7.85MB Beats51.63%of users with C++

 

class Solution {
public:
    string decodeString(string s) {

        vector<char> stack;
        for(auto c : s){
            if(c == ']'){
                vector<char> tmp_stack;
                while(stack.back() != '['){
                    // pop from stack and push into tmp_stack
                    tmp_stack.emplace_back(stack.back());
                    stack.erase(stack.end()-1);
                }
                // remove dummy '['
                stack.erase(stack.end()-1);
                // pop number from stack
                int digit = 0;
                int N = 0;
                while(stack.size() > 0 && stack.back() >= 48 && stack.back() <= 58){
                    N += (int(stack.back())-48) * (pow(10,digit++));
                    stack.erase(stack.end()-1);
                }
                cout << N << endl;
                // push substring in tmp_stack to stack N times
                for(int _ = 0; _ < N; ++_){
                    for(auto it = tmp_stack.end()-1; it >= tmp_stack.begin(); it--)
                        stack.emplace_back(*it);
                }
            } else {
                stack.emplace_back(c);
            }
        }

        return string(stack.begin(), stack.end());
    }
};

 

 

 

λ°˜μ‘ν˜•