포스트

수식의 괄호 쌍

수식의 괄호 쌍

정의


32 - {6 - (2 + 4) * 7} -> {()} O
5 + {6 - (12 + 4} * 7) -> {(}) X

주어진 괄호 문자열이 올바른지/균형잡혔는지 판단하는 문제.

괄호가 한 종류일 때

  • 안쪽부터 짝을 맞춰 지워나간다, 모두 지워진다면 올바른 문자열
  • 여는 괄호와 닫는 괄호 수를 비교한다, 수가 다르면 올바르지 않은 문자열
    • 수가 같다고 올바른 문자열인 것은 아님 (i.e. ))(()

괄호가 여러 종류일 때

  • 안쪽부터 짝을 맞춰 지워나간다, 모두 지워진다면 올바른 문자열

관찰

문자열을 앞에서부터 읽어나갈 때,
닫는 괄호는 남아있는 괄호 중에서 가장 최근에 들어온 여는 괄호와 짝을 지어 없애버리는 명령이라고 생각해도 된다.

Solve By Stack


왜 Why

배열을 이용한 구현
최대 N번 중간 원소의 삭제가 발생 O(N2)

연결 리스트을 이용한 구현
O(N)

구현

여는 괄호를 읽을 때 마다 저장하다가 닫는 괄호를 읽을 때 가장 최근에 들어온, 즉 가장 끝에 있는 여는 괄호의 짝을 이루게 해주고 pop를 하면 올바른 괄호 쌍인지 확인할 수 있다.

  1. 여는 괄호가 나오면 스택에 추가
  2. 닫는 괄호가 나왔을 경우,
    1. 스택이 비어있으면 올바르지 않은 괄호 쌍
    2. 스택의 top이 짝이 맞지 않는 괄호일 경우 올바르지 않은 괄호 쌍
    3. 스택의 top이 짝이 맞는 괄호일 경우 pop
  3. 모든 과정을 끝낸 후 스택에 괄호가 남아있으면 올바르지 않은 괄호 쌍, 남아있지 않으면 올바른 괄호 쌍

백준

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.