반응형
문제
압축되지 않은 문자열 S가 주어졌을 때, 이 문자열중 어떤 부분 문자열은 K(Q)와 같이 압축 할 수 있다. K는 한자리 정수이고, Q는 0자리 이상의 문자열이다. 이 Q라는 문자열이 K번 반복된다는 뜻이다. 압축된 문자열이 주어졌을 때, 이 문자열을 다시 압축을 푸는 프로그램을 작성하시오.
입력
첫째 줄에 압축된 문자열 S가 들어온다. S의 길이는 최대 50이다. 문자열은 (, ), 0-9사이의 숫자로만 들어온다.
출력
첫째 줄에 압축되지 않은 문자열의 길이를 출력한다. 이 값은 2,147,473,647 보다 작거나 같다.
예제 입력 133(562(71(9)))
|
예제 출력 119
|
예제 입력 2123
|
예제 출력 23
|
예제 입력 310342(76)
|
예제 출력 38
|
예제 입력 40(0)
|
예제 출력 40
|
예제 입력 51(1(1(1(1(1(1(0(1234567890))))))))
|
예제 출력 50
|
예제 입력 61()66(5)
|
예제 출력 67
|
풀이
문제에 나온 대로만 구현한다면 9(9(9(9(9(9(9(9(9(9(999)))))))))) 같은 입력에서 문자열의 길이가 9의 10승 이상 돌파하게 되므로 메모리 초과가 발생할 것이다.
따라서 문자열 압축을 풀어주되, 문자열을 전부 기록하는 것이 아니라 문자열의 총 길이만 기록하는 방식으로 풀어야 한다.
import sys
input = sys.stdin.readline
s = input().strip()
stack = []
for i in range(len(s)):
# 여는 괄호일 경우 그냥 스택에 넣는다
if s[i] == '(':
stack.append(s[i])
# 닫는 괄호일 경우 여는 괄호를 만날 때까지 순회하며 문자열의 길이를 센다.
elif s[i] == ')':
cnt = 0
while True:
cur = stack.pop()
if cur == '(':
break
else:
# cur은 1일 수도 있고, 압축을 해제한 문자열의 길이일 수도 있다.
cnt += cur
stack.append(stack.pop() * cnt)
# 숫자이므로 문자열의 길이인 1을 스택에 넣는다. 단, 해당 숫자의 다음 문자열이 여는 괄호일 경우 곱셈을 하기 위해 그대로 넣어준다.
else:
stack.append(int(s[i]) if i+1 < len(s) and s[i+1] == '(' else 1)
print(sum(stack))
반응형
'알고리즘 연습 > 스택' 카테고리의 다른 글
[🥇4 / 백준 16120 / 파이썬] PPAP (0) | 2024.06.30 |
---|---|
[Lv.2 / 프로그래머스 / 파이썬] 올바른 괄호 (0) | 2024.06.07 |
[🥈3 / 백준 12789 / 파이썬] 도키도키 간식드리미 (0) | 2023.08.09 |
[🥈4 / 백준 28278 / 파이썬] 스택 2 (0) | 2023.08.07 |
[🥈3 / 백준 17952 / 파이썬] 과제는 끝나지 않아! (2) | 2022.09.03 |