일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- 코딩
- 2
- Python
- 구현
- 더하기 시리즈
- 12969
- 정렬
- 다이나믹 프로그래밍
- 정규 표현식 #문자열
- Greedy
- 컴공
- BFS
- 백트래킹
- knuth_optimization
- DP
- 스택
- 오픽
- 브루트포스
- ENFJ
- HTML
- DFS
- 백준풀이
- 11066
- 웹 페이지 입문
- 1
- 백준
- 수 정렬하기2
- 파이썬
- 3
- 오늘의 계획
- Today
- Total
코딩하는 Fug
2504 괄호의 값 본문
https://www.acmicpc.net/problem/2504
#스택
2504번: 괄호의 값
4개의 기호 ‘(’, ‘)’, ‘[’, ‘]’를 이용해서 만들어지는 괄호열 중에서 올바른 괄호열이란 다음과 같이 정의된다. 한 쌍의 괄호로만 이루어진 ‘()’와 ‘[]’는 올바른 괄호열이다. 만일
www.acmicpc.net
#2504 괄호의 값 정리
def foranswer(l):
#생각을 좀 했는데 스택을 사용하여서 이 스택에 남는게 0이 아니면 올바르지않다고 하고 만들면 편할것 같았다 고로
#함수 이용
stack=[]
#스택사용
for i in range(len(l)):
if l[i]=='(' or l[i]=='[':
stack.append(l[i])
#(와 [가 들어오면 stack에 그냥 넣는다
elif l[i]==')':
a=0
while stack:
item=stack.pop()
if item=='(':
stack.append(2 if a==0 else a*2)
break
elif item=='[':
return 0
else:
a+=item
elif l[i]==']':
a=0
while stack:
item=stack.pop()
if item=='[':
stack.append(3 if a==0 else a*3)
break
elif item=='(':
return 0
else:
a+=item
#아래와 위는 같다 이 부분이 생각하기 좀 어려운 부분인데 우선 생각해야될 점은 처음인덱스부터 끝인덱스까지 차례대
로 간다는 것. 고로 괄호는 앞으로 가면서 닫히면서 간다 뒤를 돌아봤을때 ]나 )는 없어야 올바른 문장인 것 고로 l[i]
==")"인 경우로 따지면 신경 써야할 것은 ]가 있는가?( ")"는 무조건 없다) 그리고 "("이 나오기 전까지 어떤 숫자들이 있
는가 그리고 "("이 나오면 바로 닫혔는가 아니면 중간에 숫자가 있었는가 이정도를 생각해봐야 하는 것이다.
return stack
#올바른 문장이여서 return 0 당하지 않았다면 stack을 꺼내자
l=list(input())
#문장 입력
stack=foranswer(l)
#stack 가져오기
if stack==0:
stack=[]
#stack이 return 0 당했으면 stack==[]으로 만들자
print(0 if '(' in stack or '[' in stack else sum(stack))
#stack이 비어있지 않으면 0으로
#풀기 힘들었는데 초등부 중등부 문제란다 올림피아드긴해도 현타가 좀 온다랄까 생각하는 거 자체는 괜찮은데 컴퓨터
로 구현하는게 힘든 문제이고 함정이 좀 많은 문제였던거 같다. 특히 스택을 활용해야 하는 문제이니 만큼 스택에 어떤
허점이 있는지 생각하는게 어려웠다.
'백준풀이-python' 카테고리의 다른 글
1062 가르침 (0) | 2021.07.22 |
---|---|
14719 빗물 (0) | 2021.07.22 |
1916 최소비용 구하기 (0) | 2021.07.19 |
14888 연산자 끼워넣기 (0) | 2021.07.15 |
2581 소수 (0) | 2021.07.14 |