본문 바로가기
백준

[백준] 4949번 : 균형잡힌 세상 - 파이썬(Python) - 우당탕탕 개발자 되기 프로젝트

by 우당탕탕 개발자 2023. 12. 2.
728x90
반응형

 

 

4949번: 균형잡힌 세상

각 문자열은 마지막 글자를 제외하고 영문 알파벳, 공백, 소괄호("( )"), 대괄호("[ ]")로 이루어져 있으며, 온점(".")으로 끝나고, 길이는 100글자보다 작거나 같다. 입력의 종료조건으로 맨 마지막에

www.acmicpc.net

 

1. 문제 설명

2. 풀이과정

해당 문제는 괄호를 기준으로 균형 잡힌 문자열인지 판단하는 문제이다.

소괄호와 대괄호가 올바르게 짝지어져 있으면 균형 잡힌 문자열이고, 그렇지 않다면 균형 잡힌 문자열이 아니다.

괄호가 올바르게 짝지어져 있는지 판단하는 방법은 여는 괄호와 바로 뒤에 닫는 괄호가 일치해야 한다.

문자열의 문자를 확인하며 괄호를 스택에 추가한다. 여기서 닫는 괄호가 나왔을 때, 제일 위에 저장되어 있는 괄호가 동일한 종류의 여는 괄호라면 올바르게 짝지어져 있는 것이다.

반면에 그게 아니라면 해당 문자열은 더 이상 균형 잡힌 문자열이 아니다.

만약 모든 괄호를 확인했을 때 스택이 비어있으면 균형 잡힌 문자열이다.

 

  1. sys.stdin.readline() 함수를 사용하기 위해 sys 모듈을 불러온다. import sys
  2. '.'을 입력받을 때까지 반복해야 하므로 무한 반복문을 활용한다. while (True)
  3. 문자열을 입력받아 enter 입력을 지워 저장한다. S = sys.stdin.readline().rstrip()
  4. 만약 문자열이 '.' 하나의 입력이라면 입력을 종료한다. if (S == '.'): break
  5. 그게 아니라면 빈 스택을 하나 생성한다. stack = list()
  6. 입력받은 문자열의 각 문자를 하나씩 불러오며 for i in S
  7. 만약 해당 문자가 여는 괄호 (, [ 이면 스택에 해당 문자를 추가한다. if (i == '(') or (i == '['): stack.append(i)
  8. 만약 해당 문자가 닫는 소괄호라면 elif (i == ')')
  9. 스택이 비어있는지 확인하고 비어 있지 않다면 제일 위의 문자를 확인해 여는 소괄호이면 스택에서 제일 위의 문자인 여는 소괄호를 제거한다. if (len(stack) > 0) and (stack[-1] == '('): stack.pop()
  10. 반면에 스택이 비어있거나 제일 위의 문자가 여는 소괄호가 아니면 else
  11.  해당 문자를 스택에 추가하고 stack.append(i)
  12. 해당 문자열은 균형 잡힌 문자열이 아니므로 종료한다. break
  13. 만약 해당 문자가 닫는 대괄호라면 elif (i == ']')
  14. 스택이 비어있는지 확인하고 비어 있지 않다면 제일 위의 문자를 확인해 여는 대괄호이면 스택에서 제일 위의 문자인 여는 대괄호를 제거한다. if (len(stack) > 0) and (stack[-1] == '['): stack.pop()
  15. 반면에 스택이 비어있거나 제일 위의 문자가 여는 대괄호가 아니면 else
  16. 해당 문자를 스택에 추가하고 stack.append(i)
  17. 해당 문자열은 균형 잡힌 문자열이 아니므로 종료한다. break
  18. 문자열의 모든 문자를 확인하여 종료되었거나 문자열이 균형 잡힌 문자열이 아니라서 종료된 후, 만약 스택이 비어 있다면 yes를 출력하고 if (len(stack) == 0): print('yes')
  19. 반면에 스택이 비어있지 않다면 no를 출력한다. else: print('no')
반응형

3. 소스코드

import sys

while (True):
    S = sys.stdin.readline().rstrip()
    
    if (S == '.'):
        break
        
    stack = list()
    for i in S:
        if (i == '(') or (i == '['):
            stack.append(i)
            
        elif (i == ')'):
            if (len(stack) > 0) and (stack[-1] == '('):
                stack.pop()
            else:
                stack.append(i)
                break
                
        elif (i == ']'):
            if (len(stack) > 0) and (stack[-1] == '['):
                stack.pop()
            else:
                stack.append(i)
                break

    if (len(stack) == 0):
        print('yes')
    else:
        print('no')
728x90
반응형