백준(S4) 4949번: 균형잡힌 세상 (파이썬, python3)

2022. 12. 21. 20:46·Python/백준 문제풀이
반응형

https://www.acmicpc.net/problem/4949

 

4949번: 균형잡힌 세상

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

www.acmicpc.net

우선 이 문제는 스택 문제이다.

스택의 특징을 잘 모르시면 문제를 해결하는데 어려움이 있을 수 있어, 간단하게 스택에 대해 설명하고 코드 설명하겠습니다.

 

스택이란?

FILO(First In Last Out)의 특징을 가지고 있는 자료구조 중 하나입니다.

출처:  https://medium.com/@songjaeyoung92/%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-javascript-stack-%EC%9D%B4%EB%9E%80-31f9bbb84897

그림으로도 확인할수 있듯이 스택에 숫자 1을 넣고 2를 넣으면 pop을 할 때 숫자 2가 먼저 나가는 것을 확인할 수 있습니다.

이제 이 개념을 문제에 대입 해보겠습니다.

여기서 제가 생각하는 핵심 포인트는 짝을 이루는 두 괄호가 있을 때, 그 사이에 있는 문자열도 균형이 잡혀야 한다는 것입니다.

이 문장을 보면 소괄호와 대괄호가 짝은 이루고 있지만 균형이 잡히지 않아 no가 출력이 됐습니다.

이렇듯 소괄호로 열리면 소괄호도 닫히고 대괄호로 열리면 대괄호로 닫히는 규칙이 있음을 알 수 있습니다.

이제 이 규칙을 스택에 대입을 해보겠습니다.

우선 스택에 소괄호를 넣어보는 상상을 해보겠습니다.

 

1
2
String = []
String.append("(")
cs

파이썬에서는 이렇게 리스트를 만든 후 리스트에 삽입을 하는 형식으로 구현할 수 있습니다.

그리고 if 조건문을 사용해서 만약에 스택의 맨 위에 있는 것이 열린 소괄호이며 현재 문자열이 닫힌 소괄호면

스택에서 열린 소괄호를 제거하는 방법으로 구현하면 문제가 해결됩니다.

1
2
3
4
5
if i == "(" or i == "[":
   stack.append(i)
elif i == ")":
  if len(stack) != 0 and stack[-1] == "(":
       stack.pop()
cs

코드를 설명하자면 현재 문자가 열린 소괄호 또는 대괄호이면 스택에 삽입을 하고

닫힌 소괄호면 스택이 비어있지 않고 스택의 맨 위에 있는 문자가 열린 소괄호일 때만 pop을 해주는 코드입니다.

닫힌 대괄호도 똑같은 원리로 하시면 됩니다.

 

정답코드:

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
while True: 
    string = input()
    stack = []
    
    if string == ".":
        break
    for i in string:
        if i == "(" or i == "[":
            stack.append(i)
        elif i == ")":
            if len(stack) != 0 and stack[-1] == "(":
                stack.pop()
            else:
                stack.append(")")
                break
        elif i == "]":
            if len(stack) != 0 and stack[-1] == "[":
                stack.pop()
            else:
                stack.append("]")
                break
    if len(stack) == 0:
        print('yes')
    else:
        print("no")
 
 
String = []
String.append("(")
Colored by Color Scripter
cs
반응형
'Python/백준 문제풀이' 카테고리의 다른 글
  • 백준(S3) 14425번: 문자열 집합 (파이썬,Python3)
  • 백준(S4) 18258번: 큐 2 (파이썬, python3)
  • 백준(B1) 1110번: 더하기 사이클(파이썬)
  • 백준(B2) 2750번: 수 정렬하기 (파이썬)
코딩하는_대학생
코딩하는_대학생
Java Developer, Open Source Enthusiast, Proud Son
  • 코딩하는_대학생
    코딩하는 대학생에서 개발자까지
    코딩하는_대학생
  • 전체
    오늘
    어제
    • 분류 전체보기 (217)
      • 코딩하는 대학생의 책 추천 (8)
        • 클린코드 (5)
        • 헤드퍼스트 디자인패턴 (3)
      • Backend (7) N
        • Spring (14)
        • AWS (3)
        • 회고 (4)
        • Redis (5)
        • 다양한 시각에서 바라본 백엔드 (3)
      • Python (35)
        • 개념 및 정리 (15)
        • 백준 문제풀이 (20)
      • JAVA (17)
        • 개념 및 정리 (14)
        • 백준 문제풀이 (2)
      • 왜? (7)
      • C언어 (42)
        • 개념 및 정리 (9)
        • 백준 문제풀이 (32)
      • 개인 공부 (27)
        • 대학 수학 (5)
        • 대학 영어 (10)
        • 시계열데이터 처리 및 분석 (5)
        • 컴퓨터 네트워크 (6)
        • 운영체제 (1)
      • 솔직 리뷰 (23)
        • 꿀팁 (6)
        • IT기기 (1)
        • 국내 여행 (7)
        • 맛집 (2)
        • 알바 리뷰 (2)
      • 대외활동 (17)
        • 체리피우미 3기 (4)
        • 꿀잠이들 6기 (13)
      • 음식 평가 (1)
      • 일상 & 근황 (2)
  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
코딩하는_대학생
백준(S4) 4949번: 균형잡힌 세상 (파이썬, python3)
상단으로

티스토리툴바