DecodeString

Published at 2022-04-08

class Solution:
    def decodeString(self, s: str) -> str:
        num = 0
        strs = ''
        numStack = []
        strStack = []
        for ss in s:
            # 여는 괄호 만나면 숫자와 문자를 스택에 각각 쌓고 초기화
            if ss == '[':
                numStack.append(num)
                strStack.append(strs)
                num = 0
                strs = ''
                continue
            if ss== ']':
                strs = strStack.pop() + (strs * numStack.pop())  # (이전에 모은 str)이랑 (현재괄호의 str)x반복  을 합침
                continue
                
            # 문자와 숫자 구분해서 누적
            if 97<=ord(ss)<=122:
                strs += ss
            else:
                num = (num)*10 + int(ss)
        
        return strs
        
        
        
        
        # 밑은 recursion으로 하다가 걷잡을 수 없어져서 일단 포기한거...
        """
        # "100[leetcode]" 일 경우 숫자가 3자리인데 이거 처리 안한상태
        def recursion(start):
            i = start
            curr = ''
            repeat = ''
            while i<len(s):
                # 닫히는 괄호 만나면 앞에 숫자만큼 repeat부분을 반복해줘서 리턴
                # i를 리턴하는건 상위 스코프로 돌아갔을 때 여기 스코프의 end부터 시작하기 위해(건너뛴단뜻)
                if s[i] == ']':
                    ret = repeat * int(s[start-2])
                    return [ret, i]
                # 시작괄호면 재귀 돌리기. 돌린 결과를 repeat에 추가
                if s[i] == '[':
                    res = recursion(i+1)
                    curr += res[0]
                    repeat += res[0]
                    i = res[1]
                # 숫자도 괄호도 아니면 반복되어야 하는 부분. repeat에 누적
                if 97<=ord(s[i])<=122: #and s[i]!='[' and s[i]!=']':
                    repeat += s[i]
                i += 1
            return curr
        
        # 앞에 괄호 없는 부분 그냥 추가해주기 위해
        i=0
        while i<len(s) and 97<=ord(s[i])<=122:
            i += 1
        if(i == len(s)): return s  # i가 끝까지 돌았다면 괄호 없단뜻. 그냥 리턴
                
        # 뒤에 괄호 없는 부분 그냥 추가해주기 위해
        for j in range(len(s)-1, -1, -1):
            if s[j] == ']': break
                
        return s[:i] + recursion(0) + s[j+1:]
        """