인지용

[백준] 2257 화학식량 [python, 실버1, 스택] 본문

알고리즘

[백준] 2257 화학식량 [python, 실버1, 스택]

인지용 2026. 1. 23. 10:38

https://www.acmicpc.net/problem/2257

 

 

import sys

def input():
    return sys.stdin.readline().strip()

formula = list(input())
stack = []

for i in formula:
    if i == '(':
        stack.append(i)
    elif i == ')':
        temp = 0

        while stack:
            a = stack.pop()
            if a == '(':
                break
            else:
                temp += a
        stack.append(temp)
        
    elif i == 'H':
        stack.append(1)
    elif i == 'C':  
        stack.append(12)
    elif i == 'O':
        stack.append(16)
    else:
        stack.append(stack.pop() * int(i))

print(sum(stack))

 


 

 

알파벳이 나온다면 해당 알파벳과 매칭된 값을 스택에 넣는다.

 

")" 가 나온다면 "(" 가 나올 때 까지의 모든 값을 스택에서 꺼내 전부 더한 뒤, 결과를 스택에 다시 넣는다.

(괄호 안에 값들을 하나로 만들기)

 

숫자가 나온다면 스택 맨 마지막 값과 곱해주면 됨.

(숫자는 자기 바로 앞에 있는 값이랑만 계산)

 

 

처음에는 괄호안에서 계산된 값들을 어딘가에 보관해 놨다가 맨 마지막에 다 더해줘야 하나? 고민했다.

 

그래서 최종 더하기용 스택, 임시 더하기용 스택으로 나눠봤지만 아닌 것 같았다.

 

왜냐하면 괄호가 몇중첩까지 있을 줄 알고.. 그러면 임시 스택 하나로는 안될 테니까.

 

이차원 배열을 써야 하나? 고민도 했지만 이것도 좀 이상하고.

 

다시 생각해 보니 괄호가 닫히면 곱셈이 아니라 모두 더해주면 됐기 때문에 하나의 스택으로 해결했다!