일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
Tags
- Baekjoon
- 백준
- 스프링 배치
- cloud run
- 프로그래머스
- 포너블
- Batch
- gcp cloud build
- programmers
- nodejs
- 파이썬
- pwnable.xyz
- 네트워크
- spring Batch
- 웹해킹
- 리버싱
- 사이버보안
- 회고
- gcp ci/cd
- Python
- gcp
- 보안
- hackctf
- sequelize
- node.js
- 웹보안
- docker
- kotest
- webhacking.kr
- 시스템 해킹
Archives
uju's Tech
[Baekjoon : Python] 균형잡힌 세상: 4949 본문
<본 포스팅은 공부목적으로 작성되었습니다. 혹시 틀린 부분이 있거나 문제가 되는 부분이 있다면 답글 달아주세요!>
균형잡힌 세상: 4949
사용언어: python
문제
세계는 균형이 잘 잡혀있어야 한다. 양과 음, 빛과 어둠 그리고 왼쪽 괄호와 오른쪽 괄호처럼 말이다.
정민이의 임무는 어떤 문자열이 주어졌을 때, 괄호들의 균형이 잘 맞춰져 있는지 판단하는 프로그램을 짜는 것이다.
문자열에 포함되는 괄호는 소괄호("()") 와 대괄호("[]")로 2종류이고, 문자열이 균형을 이루는 조건은 아래와 같다.
모든 왼쪽 소괄호("(")는 오른쪽 소괄호(")")와만 짝을 이뤄야 한다.
모든 왼쪽 대괄호("[")는 오른쪽 대괄호("]")와만 짝을 이뤄야 한다.
모든 오른쪽 괄호들은 자신과 짝을 이룰 수 있는 왼쪽 괄호가 존재한다.
모든 괄호들의 짝은 1:1 매칭만 가능하다. 즉, 괄호 하나가 둘 이상의 괄호와 짝지어지지 않는다.
짝을 이루는 두 괄호가 있을 때, 그 사이에 있는 문자열도 균형이 잡혀야 한다.
정민이를 도와 문자열이 주어졌을 때 균형잡힌 문자열인지 아닌지를 판단해보자.
입력
하나 또는 여러줄에 걸쳐서 문자열이 주어진다. 각 문자열은 영문 알파벳, 공백, 소괄호("( )") 대괄호("[ ]")등으로 이루어져 있으며, 길이는 100글자보다 작거나 같다.
입력의 종료조건으로 맨 마지막에 점 하나(".")가 들어온다.
출력
각 줄마다 해당 문자열이 균형을 이루고 있으면 "yes"를, 아니면 "no"를 출력한다.
Think(문제 이해하기)
- 결론: (), [] 이렇게 짝 맞추는 문제이다.
- 짝이 맞다면 yes 안 맞다면 no 를 출력해준다.
- 내가 이 문제에서 특히 고려한 것은 stack이 isEmpty일 때와
- ()( 의 형태일 경우다.
- stack을 이용하여 (,[ 일 때 append를 이용하여 넣어주고 반대편 괄호가 나올경우 pop을 해주면서 짝이 맞는지 확인하얐다. 또한 짝이 맞지 않을 경우 flag를 바꾸어주었다. 또한 stack 리스트가 모든 과정을 진행했는데도 불구하고 len이 0이 아니라면 위의 신경쓴 형태와 같은 것이므로 이 또한 no를 출력해주었다.
구현 배경 지식
- 파아썬에서의 stack은 리스트로서 사용 가능하다.
- 값을 넣을 때는 append를 이용하여 가장 위에 값을 쌓는다.
- stack은 LIFO로 후입선출구조이다.
- pop을 통해 값을 빼내올 수 있다.
- 값을 빼지 않고 가장 위의 값을 알고싶으면 top = stack[-1] 이렇게 사용하자
접근 방법을 적용한 코드 및 해결
import sys
while True:
stack = []
word = list(str(sys.stdin.readline()))
flag = 1
if word[0] == '.':
break
for i in word:
if (i == '(') or (i=='['):
stack.append(i)
elif i == ')':
if not stack:
flag = 0
break
a = stack.pop()
if a == '(':
continue
else:
flag = 0
break
elif i == ']':
if not stack:
flag = 0
break
a = stack.pop()
if a == '[':
continue
else:
flag =0
break
if flag == 0 or len(stack) != 0:
print('no')
else:
print('yes')
아쉬운점
- 코드 정제가 너무 안되었다.
- 일단 풀이로서 올려놓지만 좀 더 간결하게 작성 가능할 것 같다.
'Baekjoon' 카테고리의 다른 글
[Baekjoon : Python] 아스키 아트 : 17072 (0) | 2020.08.01 |
---|---|
[Baekjoon : Python]약수들의 합 : 9506 (0) | 2020.08.01 |
[Baekjoon : Python] 제로 : 10773 (0) | 2020.07.31 |
[Baekjoon : Python] Byte Coin : 17521 (0) | 2020.07.31 |
[Baekjoon : Python] 좌표 정렬하기 2 : 11651 (0) | 2020.07.31 |
Comments