study gomi

[백준/baekjoon] 4949번 균형 잡힌 세상 (파이썬) 본문

Practice/Baekjoon

[백준/baekjoon] 4949번 균형 잡힌 세상 (파이썬)

공부하곰 2024. 1. 14. 12:19
728x90
반응형

내 제출

- 간단한 코드 설명↓

더보기

각 입력된 문자열을 순회하면서 여는 괄호를 스택에 넣고

닫는 괄호가 나오면 스택의 최상단 요소와 매칭되는지 확인.

 

모든 문자열을 처리한 후 스택이 비어 있고, 균형이 잡혀 있으면 'yes'를 출력하고

그렇지 않으면 'no'를 출력.

 

* 문장 입력 받는 방법에 대한 설명 참고 : https://taetaegom.tistory.com/47

while True:
    string = input().rstrip('.')

    # 입력이 '.'만 있는 경우, 종료
    if not string:
        break

    stack = []
    balanced = True

    for char in string:
        # 왼쪽 개행 문자 중에 하나면
        if char in '([':
            stack.append(char)
        # 오른쪽 소괄호면 마지막 개행 문자가 '(' 이어야 균형이 맞음.
        elif char == ')':
            # '('가 이전 문자가 아니었으면 균형 x
            if not stack or stack[-1] != '(':
                balanced = False
                break
            # 매칭이 됐으면 해당 쌍 ()은 이제 검사 x
            stack.pop()
        elif char == ']':
            if not stack or stack[-1] != '[':
                balanced = False
                break
            stack.pop()

    # 스택이 비어있고, 균형잡혔으면 'yes', 아니면 'no'
    print("yes" if balanced and not stack else "no")

 

문제 접근

- 스택을 사용하여 괄호의 균형을 확인

- 각 괄호가 올바르게 닫히는지 확인하기 위해 여는 괄호를 만날 때마다 스택에 푸시

- 그 후 닫는 괄호를 만날 때 스택의 최상단 항목과 비교.

- 균형이 맞으면 스택에서 여는 괄호를 pop한다.

- 문자열의 끝에 도달했을 때 스택이 비어 있으면 균형이 잘 맞춰진 것으로 판단.

 

결과

- 네 번 시도,,, 😫😫😫

- 첨에는 문제 이해를 잘 못 했다(왼쪽 소/대괄호 개수랑 오른쪽 소/대괄호 개수만 맞으면 된다고 생각함.)

- 소괄호 완성 한 개, 대괄호 1개일 때 ([])이건 되는데 ([)] 이건 안 됨

- 아무튼 ([둘 중 하나 만나면 일단 스택에 넣고 )]둘 중 하나 만나면 이전에 스택 넣은 거랑 짝이 맞나 확인하면 됨.

 

(그냥 내 주저리)

더보기

- 으허... 입력하는 부분 어떻게 작성해야하는지 헤맸다 ㅎ;;;;

- 그 후에는 '균형 상태'에 대한 이해를 이상하게 해서 내리 세 번을 틀렸다.

- 여튼 그래도 맞긴했다.

- 얼마전에 난이도 표시하는 방법을 알아서 적용해뒀다. 그런데 충격 그냥 난이도 모르는 게 나을 뻔 ^ㅋㅋㅋ

- silver 4 문제이길래 만만하게 봤는데 오히려 제일 많이 시도한 듯...

- 내 실력에 충격 또르르 그래서인지 몸살에 걸렸다 껄껄

- 자소서도 써야하는데 암울행

 

728x90
반응형