새소식

⌨️ Algorithms/프로그래머스

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

2022. 12. 14. 23:52

  • -

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

 

프로그래머스

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

programmers.co.kr

 

  • 문자열 s가 올바른 괄호이면 true를 return 하고, 올바르지 않은 괄호이면 false를 return
  • 올바른 괄호: '(' 문자로 열렸으면 반드시 짝지어서 ')' 문자로 닫힌 것

제한사항

  • s의 길이 : 100,000 이하의 자연수
  • s는 '(' 또는 ')' 로만 이루어져 있음

 

"""
입출력 예시)

s =  "()()" -> true
s =  "(())()" -> true
s =  ")()(" -> false
s =  "(()(" -> false
"""

 

## 의사코드 ##

# 후입선출 -> 스택

# 스택에 문자열 s 삽입
# if 스택.pop() == ')' and 스택[0] == '(': 
#     True
# else:
#     False

 

 

첫 번째 시도

 

def solution(s):
    stack = list(s)
    if stack.pop() == ')' and stack[0] == '(':
        return True
    else:
        return False

 

-> 추가 테스트 케이스 실패(런타임 에러), 효율성 테스트 하나 실패

 

 

통과한 코드

 

def solution(s):
    stack = [] # 빈 스택 생성
    for i in s:
        if i == '(': # '('로 괄호가 열린 경우
            stack.append(i) # 스택에 추가
        else: # ')'로 괄호가 닫힌 경우
            if len(stack) == 0: # 스택이 비어있으면 (= 꺼낼 문자가 없는 경우)
                return False 
            else: # 스택이 비어있지 않으면
                stack.pop() # 아까 들어간 스택의 '('를 하나 꺼냄 

    return len(stack) == 0 # 스택이 비어있으면 True, 그렇지 않다면 False

 

-> 스택에 한 번에 문자열 s를 다 추가하는 것이 아니라 '('로 괄호가 열린 경우만 추가하고, 스택에 원소가 존재하면서 ')'로 닫힌 괄호인 경우에 스택의 원소를 하나씩 꺼냄

 

return len(stack) == 0 # 스택이 비어있으면 True, 그렇지 않다면 False

-> 이때, 스택이 비어있다는 뜻은 '('로 시작해서 ')'로 끝났다는 의미

 

 

cf) 이전에 작성했던 코드

 

https://monzheld.tistory.com/65

 

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

https://school.programmers.co.kr/learn/courses/30/lessons/12909 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는

monzheld.tistory.com

 

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다!