[python] 백준 4949번

도덩이의 개발 일지·2024년 9월 25일

백준

목록 보기
99/131
post-thumbnail

안녕하세요 !

오늘은 백준 - 균형잡힌 세상 문제를 가져왔습니다.


문제 설명


해결 방법

문제를 해결한 방법은 다음과 같습니다.

  1. 반복을 통해 입력을 받아주고 종료 조건을 추가합니다.
  2. 입력받은 문자가 균형있는지 판단하기 위해 함수에 인수로 보내주고 그 반환값이 True이면 yes, False이면 no를 출력합니다.
  3. 함수에서 문자열을 반복하며 문자가 오른쪽 괄호인 (이거나 [ 이면 스택에 추가합니다.
  4. 만약 문자가 왼쪽 괄호인 )이거나 ]이고 스택에 마지막 요소가 짝이 맞으면 요소를 제거하고 그 반대이면 False를 반환합니다. 스택에 요소가 없어도 False를 반환합니다.
  5. 문자열 반복이 끝나고도 스택에 요소가 남아있으면 False를, 그 반대면 True를 반환합니다.

  1. 반복을 통해 입력을 받아주고 종료 조건을 추가합니다.

백준 예제에 보면 종료조건인 "."와 입력 문자열인 " ."를 구별해야해서 아래와 같은 코드를 작성했습니다.

while 1:
    string = sys.stdin.readline()
    if string.strip() == "." and len(string) == 2:
        break

  1. 입력받은 문자가 균형있는지 판단하기 위해 함수에 인수로 보내주고 그 반환값이 True이면 yes, False이면 no를 출력합니다.
    result = isValid(string)
    if result:
        print("yes")
    else:
        print("no")

  1. 함수에서 문자열을 반복하며 문자가 오른쪽 괄호인 (이거나 [ 이면 스택에 추가합니다.
    for i in range(len(string)):
        if string[i] == '(' or string[i] == '[':
            stack.append(string[i])

  1. 만약 문자가 왼쪽 괄호인 )이거나 ]이고 스택에 마지막 요소가 짝이 맞으면 요소를 제거하고 그 반대이면 False를 반환합니다. 스택에 요소가 없어도 False를 반환합니다.
        elif string[i] == ")":
            if len(stack) == 0:
                return False
            if stack[-1] == "(":
                stack.pop()
            else:
                return False
        elif string[i] == "]":
            if len(stack) == 0:
                return False
            if stack[-1] == "[":
                stack.pop()
            else:
                return False

  1. 문자열 반복이 끝나고도 스택에 요소가 남아있으면 False를, 그 반대면 True를 반환합니다.
    if len(stack):
        return False
    return True

전체 코드

import sys

def isValid(string):
    stack = []
    for i in range(len(string)):
        if string[i] == '(' or string[i] == '[':
            stack.append(string[i])
        elif string[i] == ")":
            if len(stack) == 0:
                return False
            if stack[-1] == "(":
                stack.pop()
            else:
                return False
        elif string[i] == "]":
            if len(stack) == 0:
                return False
            if stack[-1] == "[":
                stack.pop()
            else:
                return False
    
    if len(stack):
        return False
    return True
            

while 1:
    string = sys.stdin.readline()
    if string.strip() == "." and len(string) == 2:
        break
    result = isValid(string)
    if result:
        print("yes")
    else:
        print("no")
profile
말하는 감자에서 개발자로 ( ´͈ ᵕ `͈ )◞♡

0개의 댓글