카테고리 없음

[알고리즘 문제 풀이] 4866. 괄호검사

dmscks3126 2024. 9. 11. 13:48

 

📍  문제 요약

 

주어진 입력에서 괄호 {}, ()가 제대로 짝을 이뤘는지 검사하는 프로그램을 만드시오.

예를 들어 {( )}는 제대로 된 짝이지만, {( })는 제대로 된 짝이 아니다.
입력은 한 줄의 파이썬 코드일수도 있고, 괄호만 주어질 수도 있다.

 

정상적으로 짝을 이룬 경우 1, 그렇지 않으면 0을 출력한다. 

print(‘{‘) 같은 경우는 입력으로 주어지지 않으므로 고려하지 않아도 된다.

 

 

🧩 로직 설계 1 >> X

1) 주어진 문자열을 stack에 하나씩 넣으며 검사

2) '(' 라면 넣는다

3) ')' 라면 '(' == stack[-1]  을 뺀다.

4) 스택에 뭐라도 남았다면 괄호검사 실패 >> return 0

5) 안남았다면 괄호검사 성공 >> return 1

 

🧩 로직 설계 2 >> O

1) 주어진 문자열을 stack에 넣으면서 검사

2) '(' or '{' 이라면 넣고

3) ')' or '}' 이라면 빈 스택인지 검사하고, pop한 값이 '(' or '{' 인지 검사

4) result = 1 로 초기화, 검사가 다 돌았을 시 문제가 없으면 그대로 출력

5) 스택이 비었거나, 알맞은 괄호가 아니라면 result = 0출력

 

💡 소스 코드

T = int(input())
for tc in range(1, T+1):
    s = input()

    stack = []
    result = 1

    for char in s:
        if char == '(' or char == '{':
            stack.append(char)

        elif char == ')':
            if not stack or stack.pop() != '(':
                result = 0
                break

        elif char == '}':
            if not stack or stack.pop() != '{':
                result = 0
                break

    if stack:
        result = 0

    print(f'#{tc} {result}')

 

🔎 회고

  • stack[-1]과 stack.pop() 은 다르다.
    • stack.pop(): 스택에서 마지막 요소를 제거하고 그 값을 반환
      즉, 요소를 꺼낸 후 스택에서 그 요소는 더 이상 존재하지 않는다
    • stack[-1]: 스택에서 마지막 요소를 제거하지 않고 단순히 참조한다. 따라서 스택의 상태는 변하지 않는다
  • 문제를 잘 읽어야 한다. '(' 뿐만 아니라 '{' 도 검사해줘야 함