균형잡힌 세상 [ Python ] [ 백준 : 4949 ]

2023. 5. 27. 21:48알고리즘/백준


풀이 및 회고 

 

오랜만에 문제이해가 쉬웠으나 푸는건 어려웠던 문제였다.

괄호 짝이 맞는지 찾는 문제인데 처음에 딕셔너리를 사용하려했다가 아닌거 같아 포기하고 if 로 조건을 걸어서 풀었다.

3시간씩걸릴 문제가 아니겠지만 풀면서 노트에 적어서 반복문이 어떻게 돌아가는지 적어가면서 잘못되면 수정하는 방식으로 풀었다.

다 제출하고 난 다음 다른사람의 코드를 살펴봤는데 처음에 포기했던 딕셔너리를 사용하는 방식이 눈에 들어왔다.

포기한게 아쉬웠고 이렇게보면 안되는게 없는 것 같다. 포기하지말자

# 균형잡힌 세상

# 1. 문자열 입력받기
# 2. 괄호만 리스트에 넣는다.
# 3. 반복문을 통해 검증한다.
# 4. 출력한다.

# ((((
import sys
while True:
    s = sys.stdin.readline().rstrip()

    stack = []

    # 스택이 비어있으면 yes 아니면 no
    # ([)] 입력시
    # stack = ["(", "["]
    # ["(", "[", ]
    # []()
    # stack = ["[", ""]
    # 
    if s == '.':
        break
    for i in s:
        if i == '(' or i == '[':
            stack.append(i)
        elif i == ']':
            # 스택이 비어있지 않고 마지막 값이 [ 일때 빼고
            if stack and stack[-1] == '[':
                stack.pop()
            # 스택이 비어있고 마지막 값이 ] 일때 넣기
            else:
                stack.append(i)
        elif i == ')':
            # 스택이 비어있지 않고 마지막 값이 ( 일때 빼고
            if stack and stack[-1] == '(':
                stack.pop()
            # 스택이 비어있고 마지막 값이 ] 일때 넣고
            else:
                stack.append(i)
        else:
            continue

    if not stack:
        print('yes')
    else:
        print('no')

# 민승님 코드 =======================
# while True:
#     stack = []
#     괄호_dict = {
#         ')' : '(',
#         ']' : '[',
#     }
#     success = True
#     string = input()
#     if string == ".":
#         break
#     for str in string:
#         if str in 괄호_dict:
#             if stack and stack[-1] == 괄호_dict[str]:
#                 stack.pop()
#             else:
#                 print('no')
#                 break
#         elif str == '(' or str == '[':
#             stack.append(str)
#     else:
#         if stack:
#             print('no')
#         else:
#             print('yes')

# 다른 사람이 푼 코드
# import sys

# while True:

#     line = sys.stdin.readline().rstrip()

#     if line == '.':
#         break

#     # 스택 생성
#     stack = []

#     # {닫는괄호 : 여는괄호} 형식으로 사전 생성
#     dict = {')' : '(', ']' : '['}

#     # 결과
#     result = "yes"

#     # 문자 검색
#     for char in line:

#         # 열린 괄호라면
#         if char in '([':
#             # 스택에 추가
#             stack.append(char)

#         # 닫힌 괄호라면
#         if char in ')]':

#             # 스택에 열린 괄호가 없다면
#             if (len(stack) == 0):
#                 result = "no"
#                 break

#             else:
#                 # 스택의 TOP과 짝이 맞지 않는다면
#                 if (dict[char] != stack.pop()):
#                     result = "no"
#                     break

#     # 스택에 열린 괄호가 남아있다면
#     if (len(stack) > 0):
#         print("no")
#     else:
#         print(result)