[문제]
괄호가 바르게 짝지어졌다는 것은 '(' 문자로 열렸으면 반드시 짝지어서 ')' 문자로 닫혀야 한다는 뜻입니다. 예를 들어
- "()()" 또는 "(())()" 는 올바른 괄호입니다.
- ")()(" 또는 "(()(" 는 올바르지 않은 괄호입니다.
'(' 또는 ')' 로만 이루어진 문자열 s가 주어졌을 때, 문자열 s가 올바른 괄호이면 true를 return 하고, 올바르지 않은 괄호이면 false를 return 하는 solution 함수를 완성해 주세요.
제한사항
- 문자열 s의 길이 : 100,000 이하의 자연수
- 문자열 s는 '(' 또는 ')' 로만 이루어져 있습니다.
https://school.programmers.co.kr/learn/courses/30/lessons/12909
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
🎨 풀이
💡 전체 코드
def solution(s):
answer = True
stack = []
for i in range(len(s)):
if s[i] == "(":
stack.append("(")
else:
if len(stack) != 0:
if stack[-1] == "(":
stack.pop()
else :
stack.append(")")
else :
stack.append(")")
if len(stack) != 0 :
answer = False
return answer
> 핵심 : "(" , ")"가 만나려고 할 때 pop 해주고, 나중에 stack에 남은 게 있는 지 확인하기!
🍦 코드 설명 (실행 순서대로 나열)
#solution
answer = True
stack = []
1. 변수와 스택를 초기화한다.
- answer : 정답
- stack : "(" 또는 ")" 가 들어올 공간
- "(" , ")" 개수가 맞더라도 순서에 따라 올바른 괄호 / 틀린 괄호가 될 수 있기 때문에 스택 활용했음!
#solution - 인형 집어 올리기 & 비교해주기
for i in range(len(s)):
if s[i] == "(":
stack.append("(")
else:
if len(stack) != 0:
if stack[-1] == "(":
stack.pop()
else :
stack.append(")")
else :
stack.append(")")
2. [s[i]가 "(" 라면] stack에 그대로 append 해준다.
3. [s[i]가 ")" 라면] 먼저 stack이 비어있는 지 확인한다.
4. [s[i] == ")" & stack이 비어있지 않은 경우] stack의 맨 끝에 있는 문자가 "("인지 확인한다.
만약, stack 맨 끝의 문자가 "("라면 pop을 해준다. 아니라면 ")"을 append 해준다.
5. [s[i] == ")" & stack이 비어있는 경우] stack에 ")"를 append 해준다.
if len(stack) != 0 :
answer = False
return answer
6. stack이 비어있지 않다면 answer을 False로 바꾼다.
7. answer을 return 한다.

끝~
⭐ 느낀점
> 예전에 백준에서 풀어본 문제랑 같은 유형이라 잘 푼 것 같다. 하하. 이제 좀 어려운 문제들 위주로 풀어봐야하나 싶긴 하다잉. 파이팅해보자!
'🎲 알고리즘 공부 > 프로그래머스' 카테고리의 다른 글
[프로그래머스 / Level 2] 숫자의 표현 (파이썬) (0) | 2022.09.19 |
---|---|
[프로그래머스 / Level 2] 다음 큰 숫자 (파이썬) (0) | 2022.09.18 |
[프로그래머스 / Level 1] 크레인 인형뽑기 게임 (파이썬) (0) | 2022.09.16 |
[프로그래머스 / Level 1] 성격 유형 검사하기 (파이썬) (0) | 2022.09.15 |
[프로그래머스 / Level 2] 이진 변환 반복하기 (파이썬) (0) | 2022.09.14 |