boj 1662 [스택, 재귀]

돌멩e·2022년 7월 13일
0

알고리즘 뿌수기

목록 보기
9/17
post-thumbnail

boj 1662

📍 Idea Logic

  1. 스택에 문자열을 넣는다.
  2. 끝 괄호 ')'는 스택에서 빼버린다.
  3. 끝 괄호 다음이 숫자일 경우, 숫자를 pop 시켜 그 개수를 시작 괄호 '(' 만날 때까지 센다(cnt).
  4. 시작 괄호 다음이 숫자일 경우, cnt 값에 해당 숫자만큼을 곱한다.
  5. 이런 논리로 cnt 값을 만든다.
  6. 그냥 숫자일 경우 cnt + 1

❗️ ERROR Point

  • 스택에 넣고 숫자이다가 ( 앞의 숫자를 다르게 처리할 수 있는 방안을 찾지 못함

📌 New Arrival

.isdigit()

  • 숫자인지 판별해주는 함수 : True/False)

🔑 Solution

  1. 숫자, "(" 인 경우 => 그대로 스택에 저장
  2. 숫자, 숫자 인 경우 => 문자열 +1로 스택에 저장
import sys

s = stdin.readline().strip()
stack = []

for i in range(len(s)):
    if s[i] == "(":
        stack.append("(")
    elif s[i] == ")":  # 한 텀이 끝나면!
        cnt = 0
        while True:
            tmp = stack.pop()  # 다시 앞으로 돌아가면서
            if tmp == "(":     # 여는 괄호를 만날 때까지 반복
                break
            cnt += tmp         # () 사이에 저장된 문자열의 수를 더하기
            # "( 앞에 있는 반복 횟수 * () 사이 문자열의 크기" 를 구해서 다시 저장하기
        stack.append(int(stack.pop()) * cnt)  
    elif i < len(s) - 1 and s[i + 1] == "(":  # 숫자, ( 조합이 들어온 경우
        stack.append(int(s[i]))  # 숫자 그대로 반복 숫자로 추가
    else:  # 숫자, 숫자 조합이 들어온 경우
        stack.append(1)  # 숫자의 크기는 문자열 1개이므로 1을 저장

# 총 문자열의 길이 구하기
answer = 0
for st in stack:
    answer += st
print(answer)

출처

profile
돌이 되고 싶어요

0개의 댓글

관련 채용 정보