괄호 변환 문서의 문제 1 풀이 코드다. if __name__ == "__main__": 아래가 자체 테스트다.

"""괄호 변환 (프로그래머스 60058) 풀이와 검증."""
from itertools import product


def is_correct(s):
    bal = 0
    for ch in s:
        bal += 1 if ch == "(" else -1
        if bal < 0:
            return False
    return bal == 0


def solution(p):
    if p == "":
        return ""
    bal = 0
    for i, ch in enumerate(p):
        bal += 1 if ch == "(" else -1
        if bal == 0:
            u, v = p[:i + 1], p[i + 1:]
            break
    if is_correct(u):
        return u + solution(v)
    flipped = "".join("(" if ch == ")" else ")" for ch in u[1:-1])
    return "(" + solution(v) + ")" + flipped


if __name__ == "__main__":
    assert solution("(()())()") == "(()())()"
    assert solution(")(") == "()"
    assert solution("()))((()") == "()(())()"
    assert solution("))((") == "()()"
    count = 0
    for n in range(2, 13, 2):
        for t in product("()", repeat=n):
            p = "".join(t)
            if p.count("(") != p.count(")"):
                continue
            count += 1
            r = solution(p)
            assert is_correct(r) and len(r) == len(p), (p, r)
            if is_correct(p):
                assert r == p
    assert count == 1274, count
    print("ALL CHECKS PASSED")