1 분 소요

쇠막대기

문제 정리

입력

()(((()())(())()))(())

처리 과정

  1. 입력을 스트링 변수(str)에 받기
  2. 빈 스택 리스트를 생성
  3. 여는 괄호를 만나면 무조건 스택에 넣기
  4. 닫는 괄호를 만났을 때에는 두가지 경우가 있음
  5. str에서 해당 닫는 괄호 바로 이전 문자가 여는 괄호였을 때: 레이저 -> cnt+=len(stack) (쇠막대기는 쌓여있기 때문에 스택에 있는 '('의 수(=겹쳐있는 쇠막대기의 수)만큼 cnt에 누적)
  6. str에서 해당 닫는 괄호 바로 이전 문자가 여는 괄호가 아닐 때: 쇠막대기의 끝 -> cnt+=1 (막대기의 마지막 조각(1개)을 cnt에 누적)

출력

17

내 답

import sys
sys.stdin = open("./input/in2.txt", "rt")

lst=list(map(str,input()))
stack=[]

cnt=0 # 쇠막대기 조각의 개수

# 리스트의 인덱스와 value를 둘 다 알고싶을 때는 enumerate
for i,x in enumerate(lst):
    if x=='(': # 여는 괄호는 무조건 스택에 넣기
        stack.append(x)
    else: # 닫는 괄호를 만났을 때 주의!
        if lst[i-1]=='(': # 레이저인 경우
            stack.pop()
            cnt+=len(stack) # 스택에 있는 여는 괄호의 수만큼 cnt에 누적
        else: # 막대기가 끝난 지점
            stack.pop()
            cnt+=1 # 막대기의 마지막 조각(1개)을 cnt에 누적
        

print(cnt)

풀이

import sys
sys.stdin = open("./input/in2.txt", "rt")

str=input() # 스트링 변수
stack=[]

cnt=0 # 쇠막대기 조각의 개수

for i in range(len(str)):
    if str[i]=='(': # 여는 괄호는 무조건 스택에 넣기
        stack.append(str[i])
    else: # 닫는 괄호를 만났을 때 주의!
        stack.pop()
        if str[i-1]=='(': # 레이저인 경우
            cnt+=len(stack) # 스택에 있는 여는 괄호의 수만큼 cnt에 누적
        else: # 막대기가 끝난 지점
            cnt+=1 # 막대기의 마지막 조각(1개)을 cnt에 누적

print(cnt)

정리

  • enumerate: 리스트의 인덱스와 value 모두에 접근 가능
  • 🧐 쇠막대기 문제 논리


💛 개인 공부 기록용 블로그입니다. 👻

맨 위로 이동하기

태그:

카테고리:

업데이트: