[백준 알고리즘] 4949번: 균형잡힌 세상 (파이썬 / Python)

2022. 8. 13. 17:31·알고리즘/백준
문제

세계는 균형이 잘 잡혀있어야 한다. 양과 음, 빛과 어둠 그리고 왼쪽 괄호와 오른쪽 괄호처럼 말이다.

정민이의 임무는 어떤 문자열이 주어졌을 때, 괄호들의 균형이 잘 맞춰져 있는지 판단하는 프로그램을 짜는 것이다.

문자열에 포함되는 괄호는 소괄호("()") 와 대괄호("[]")로 2종류이고, 문자열이 균형을 이루는 조건은 아래와 같다.

  • 모든 왼쪽 소괄호("(")는 오른쪽 소괄호(")")와만 짝을 이뤄야 한다.
  • 모든 왼쪽 대괄호("[")는 오른쪽 대괄호("]")와만 짝을 이뤄야 한다.
  • 모든 오른쪽 괄호들은 자신과 짝을 이룰 수 있는 왼쪽 괄호가 존재한다.
  • 모든 괄호들의 짝은 1:1 매칭만 가능하다. 즉, 괄호 하나가 둘 이상의 괄호와 짝지어지지 않는다.
  • 짝을 이루는 두 괄호가 있을 때, 그 사이에 있는 문자열도 균형이 잡혀야 한다.

정민이를 도와 문자열이 주어졌을 때 균형잡힌 문자열인지 아닌지를 판단해보자.

 

입력
 

하나 또는 여러줄에 걸쳐서 문자열이 주어진다. 각 문자열은 영문 알파벳, 공백, 소괄호("( )") 대괄호("[ ]")등으로 이루어져 있으며, 길이는 100글자보다 작거나 같다. 각 줄은 마침표(".")로 끝난다.

입력의 종료조건으로 맨 마지막에 점 하나(".")가 들어온다.
 
 
출력

각 줄마다 해당 문자열이 균형을 이루고 있으면 "yes"를, 아니면 "no"를 출력한다.

 

예제 입력
So when I die (the [first] I will see in (heaven) is a score list).
[ first in ] ( first out ).
Half Moon tonight (At least it is better than no Moon at all].
A rope may form )( a trail in a maze.
Help( I[m being held prisoner in a fortune cookie factory)].
([ (([( [ ] ) ( ) (( ))] )) ]).
 .
.
예제 출력
yes
yes
no
no
no
yes
yes

문제 접근

stack 문제이다. 

간단하게 생각했을 때, 오른쪽 괄호가 들어오면 push, 왼쪽 괄호가 들어오면 pop이다.

균형이 잡히지 않은 경우는 크게 세 가지이다.

1. 왼쪽 괄호가 들어왔을 때 pop하는 대상이 다른 종류인 경우

-> '[(])'  같은 경우 틀린 괄호이기 때문이다. ']' 다음으로 '(' 가 인식된 경우, 또는 ')' 다음으로 '[' 가 인식된 경우 균형을 이루지 않다고 판단해야 한다.

2. 왼쪽 괄호가 오른쪽 괄호보다 많아지는 순간이 발생하는 경우 (빈 stack에 왼쪽 괄호 들어옴)

3. 오른쪽 괄호가 왼쪽 괄호보다 많을 때 (마지막에 stack이 비어있지 않음, push > pop)

 

정답 코드
#4949번: 균형잡힌 세상

import sys

def test(s):
    stack = []
    for i in range(len(s)):
        char = s[len(s)-2-i]    #문자열의 뒷부분부터 탐색, -2를 하면 마지막 '.'을 생략 가능

        if char == ']':
            stack.append(']')
        elif char == ')':
            stack.append(')')
        elif char == '[':
            if len(stack) == 0: #스택이 비어있는데 왼쪽 괄호가 들어온 경우
                return 'no'
            else:
                if stack[len(stack)-1] != ']': #같은 종류 괄호끼리 짝지어지지 않은 경우
                    return 'no'
                else: stack.pop()
        elif char == '(':
            if len(stack) == 0: #스택이 비어있는데 왼쪽 괄호가 들어온 경우
                return 'no'
            else:
                if stack[len(stack)-1] != ')': #같은 종류 괄호끼리 짝지어지지 않은 경우
                    return 'no'
                else: stack.pop()
    if len(stack) == 0:  #스택이 비어있다면 (오른쪽괄호 수 = 왼쪽괄호 수)
        return 'yes'
    else: return 'no'    #비어있지 않음 (오른쪽괄호 수 > 왼쪽괄호 수)

while True:
    s = sys.stdin.readline().rstrip()
    if s == '.':        #'.' 하나만 있는 경우 (입력종료조건)
        break
    print(test(s))

설명은 주석을 참고하면 될 것 같다.


 

4949번: 균형잡힌 세상

하나 또는 여러줄에 걸쳐서 문자열이 주어진다. 각 문자열은 영문 알파벳, 공백, 소괄호("( )") 대괄호("[ ]")등으로 이루어져 있으며, 길이는 100글자보다 작거나 같다. 각 줄은 마침표(".")로 끝난다

www.acmicpc.net

 

저작자표시 (새창열림)

'알고리즘 > 백준' 카테고리의 다른 글

[백준 자바스크립트] node.js 환경에서 콘솔 입출력  (0) 2023.06.02
[백준 알고리즘] 1874번: 스택 수열 (파이썬 / Python)  (0) 2022.08.13
[백준 알고리즘] 1181번: 단어 정렬 (파이썬 / Python)  (0) 2022.08.13
[백준 알고리즘] 11653번: 소인수분해 (파이썬 / Python)  (0) 2022.08.13
[백준 알고리즘] 10989번: 수 정렬하기 3 (파이썬 / Python)  (0) 2022.08.11
'알고리즘/백준' 카테고리의 다른 글
  • [백준 자바스크립트] node.js 환경에서 콘솔 입출력
  • [백준 알고리즘] 1874번: 스택 수열 (파이썬 / Python)
  • [백준 알고리즘] 1181번: 단어 정렬 (파이썬 / Python)
  • [백준 알고리즘] 11653번: 소인수분해 (파이썬 / Python)
gyujh
gyujh
개발 공부 블로그
  • gyujh
    규
    gyujh
  • 전체
    오늘
    어제
    • 분류 전체보기 (86)
      • Backend&DB (3)
      • CS (5)
        • 컴퓨터구조 (1)
        • 소프트웨어공학 (4)
      • JavaScript (2)
      • Git (2)
      • 알고리즘 (73)
        • 개념 (3)
        • 백준 (70)
      • Projects (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    너비우선탐색
    에러
    답
    BOJ
    재귀
    구현
    답안
    알고리즘
    딕셔너리
    프로그래머스
    정답
    algorithm
    시간초과
    스택
    런타임
    백준
    정렬
    풀이
    숏코딩
    문자열
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
gyujh
[백준 알고리즘] 4949번: 균형잡힌 세상 (파이썬 / Python)
상단으로

티스토리툴바