프로그래밍이나 수학에서 표현식을 다루다 보면, 그 안의 괄호가 서로 짝이 맞게 열리고 닫혔는지 확인해야 하는 경우가 자주 발생합니다. 여기서 말하는 '균형 잡힌(balanced)' 상태란 모든 여는 괄호에 대응하는 닫는 괄호가 존재하고, 괄호의 배열 순서까지 올바르다는 의미입니다. 괄호를 많이 사용하는 프로그램 코드나 수학식을 작성할 때 이러한 검증은 매우 중요합니다. 이 글에서는 파이썬(Python)을 활용해 괄호가 포함된 표현식이 균형 잡혀 있는지 프로그래밍 방식으로 판별하는 방법을 살펴보겠습니다.
제거(Elimination) 방식으로 확인하기
이 방법의 핵심은 가장 안쪽에 있는 괄호 쌍을 찾아내어 빈 문자열로 치환하는 것입니다. 더 이상 완전한 괄호 쌍이 남아 있지 않을 때까지 이 과정을 반복합니다. 모든 치환이 끝난 후에도 괄호가 남아 있다면 해당 표현식은 균형이 맞지 않는 것이고, 아무것도 남지 않았다면 균형 잡힌 표현식으로 판단할 수 있습니다.
예제 코드
def brackets(expression):
all_br = ['()', '{}', '[]']
while any(x in expression for x in all_br):
for br in all_br:
expression = expression.replace(br, '')
return not expression
# 함수 호출
input_string = "([]{}()"
if brackets(input_string):
print(input_string, "balanced")
else:
print(input_string, "Not balanced")코드 동작 원리
함수 내부에는 소괄호(), 중괄호{}, 대괄호[] 세 가지 괄호 쌍을 리스트로 정의합니다. while 문은 표현식 안에 완전한 괄호 쌍이 하나라도 존재하는 동안 반복되며, 각 반복마다 replace() 메서드를 통해 해당 괄호 쌍을 제거합니다. 마지막에는 not expression을 반환하는데, 문자열이 완전히 비어 있으면 True(균형 잡힘), 괄호가 남아 있으면 False(불균형)를 의미합니다.
실행 결과
위 코드를 실행하면 다음과 같은 결과를 얻을 수 있습니다.
([]{}() Not balanced예제의 입력 문자열 "([]{}()" 는 여는 소괄호 '('에 대응하는 닫는 괄호가 없기 때문에 불균형으로 판정됩니다. 참고로 이 제거 방식은 구현이 간단하다는 장점이 있지만, 복잡한 중첩 구조를 정밀하게 검증해야 하는 경우에는 스택(stack) 자료구조를 활용하는 방식이 더 널리 사용됩니다.