K(Q)에서 K는 한자리 정수, Q는 0자리 이상의 문자열이다.
이는 Q라는 문자열이 K번 반복된다는 뜻이다.
예를 들면, 1(9) = 9
이고 2(79) = 7979
이다.
첫 번째 예제로 봐보자. 주어진 문자열을 한 단계씩 압축을 풀면 아래와 같다.
33(562(71(9)))
= 33(562(7 9))
= 33(56 79 79)
= 3 567979 567979 567979
해당 문자열의 길이가 19가 되므로, 출력으로는 19가 출력된다.
def decompress(s):
import sys
input = sys.stdin.readline
sys.setrecursionlimit(10**5)
s = input().rstrip()
def decompress(s):
# 주어진 문자열에 괄호가 없다면 반환
if '(' not in s and ')' not in s:
return s
stack = []
temp = []
flag = 0
for elem in s:
if elem == ')' and flag == 0:
while stack[-1] != '(':
temp.append(stack.pop())
stack.pop() # '('
temp = int(stack.pop()) * temp # 괄호 속 문자열을 K번 반복하고
stack = stack + temp # 기존 문자열과 합쳐준다
flag = 1
continue
stack.append(elem)
# 압축을 푼 문자열을 s에 새로 저장하여 모든 압축이 풀릴 때까지 재귀
s = ''.join(elem for elem in stack)
return decompress(s)
result = decompress(s)
print(len(result))
...
결국 다른 사람의 코드를 참고해서 문제를 풀었다.
length
temp
import sys
input = sys.stdin.readline
s = input().rstrip()
stack = []
length = 0
temp = ''
for c in s:
if c.isdigit():
length += 1
temp = c
elif c == '(':
# K와 이제까지의 길이를 tuple 형태로 저장
# 1을 빼는 이유: '(' 바로 앞의 숫자는 K(괄호 안 숫자의 길이와 곱해지는 값)이기 때문에 제외하고 count
stack.append((temp, length - 1))
# 괄호가 또 나올 수 있으므로 초기화
length = 0
else: # c == ')'
mul, pre = stack.pop()
length = (int(mul) * length) + pre
print(length)