본문 바로가기

알고리즘/Python

[Python | 프로그래머스] 올바른 괄호

https://school.programmers.co.kr/learn/courses/30/lessons/12909

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제

괄호가 바르게 짝지어졌다는 것은 '(' 문자로 열렸으면 반드시 짝지어서 ')' 문자로 닫혀야 한다는 뜻입니다. 예를 들어

"()()" 또는 "(())()" 는 올바른 괄호입니다.
")()(" 또는 "(()(" 는 올바르지 않은 괄호입니다.
'(' 또는 ')' 로만 이루어진 문자열 s가 주어졌을 때, 문자열 s가 올바른 괄호이면 true를 return 하고, 올바르지 않은 괄호이면 false를 return 하는 solution 함수를 완성해 주세요.

 

제출 답안

def solution(strs):
    answer = True
    stack = []
    
    for s in strs:
        # '('는 stack에 추가
        if s == "(":
            stack.append(s)

        # i == ')'인 경우
        else:
            if stack and stack.pop()=='(':      # '('가 ')'와 짝을 이루면 stack에서 '(' 하나 제거
                continue
            else:                               # 괄호 짝이 ')'로 시작하면 False 반환
                return False
    if stack:
        return False
    return True

 

개선 답안

  • pair 변수는 현재까지 발견된 괄호의 쌍의 수
  • for 루프가 끝나면, pair의 값이 0이면 모든 열린 괄호가 닫히고 올바른 괄호 쌍이 형성되었음을 의미하므로 True를 반환
  • 그렇지 않으면 False를 반환
def is_pair(s):
    pair = 0
    for x in s:
        if pair < 0: break
        pair = pair + 1 if x == "(" else pair - 1 if x == ")" else pair
    return pair == 0


# 아래는 테스트로 출력해 보기 위한 코드입니다.
print( is_pair("(hello)()"))
print( is_pair(")("))

 

참고 자료

https://velog.io/@ssongplay/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%98%AC%EB%B0%94%EB%A5%B8-%EA%B4%84%ED%98%B8-Python

 

[프로그래머스] 올바른 괄호 (Python)

프로그래머스 - 올바른 괄호테스트5와 테스트11을 통과하지 못했다. ㅠㅠ 내가 너무 단순하게 생각한 듯 하다. 검색해보니 스택을 사용하면 되는 것 같았다. 힌트를 얻은 뒤 다시 시도해보았다.

velog.io

https://school.programmers.co.kr/learn/courses/30/lessons/12909/solution_groups?language=python3 

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr