문제
문제 설명
괄호가 바르게 짝지어졌다는 것은 '(' 문자로 열렸으면 반드시 짝지어서 ')' 문자로 닫혀야 한다는 뜻입니다. 예를 들어
- "()()" 또는 "(())()" 는 올바른 괄호입니다.
- ")()(" 또는 "(()(" 는 올바르지 않은 괄호입니다.
'(' 또는 ')' 로만 이루어진 문자열 s가 주어졌을 때, 문자열 s가 올바른 괄호이면 true를 return 하고, 올바르지 않은 괄호이면 false를 return 하는 solution 함수를 완성해 주세요.
제한사항- 문자열 s의 길이 : 100,000 이하의 자연수
- 문자열 s는 '(' 또는 ')' 로만 이루어져 있습니다.
입력 & 출력
입출력 예
sanswer
"()()" | true |
"(())()" | true |
")()(" | false |
"(()(" | false |
풀이 과정
collections에서 제공하는 deque를 사용
조건문 판별할때 판별하면서 바로 pop이 수행되도록 처음에 구성하였는데 중복으로 pop이 일어나는 부작용이 있어서 일부 코드를 수정
1. deque를 가져와서 자료형을 선언해준다 이는 popleft를 사용하여 큐와 같은 모습을 사용하기 위하서 이다.
2. 조건문은 크게 "("가 들어왔을 때와 ")"가 들어왔을 때로 나눌 수 있으며 "(" 일 때는 check라는 배열에 순서대로 append 해주며 ")"가 들어왔을 때는 check에 있는 "("를 하나씩 빼주면서 한쌍이 될 때는 check에 내용이 남아있지 않게 구성한다.
3. 2번을 수행할때 ")" 닫히는 괄호가 나왔을 때 check 배열에 아무 값이 없다면 문제에서 이야기하는 False의 경우이므로 answer에 바로 False를 넣어주면서 for문을 종료하도록 한다.
4. 모든 for문이 다 수행되었을때 check 배열에 값이 남아있는 경우에도 한쌍으로 구성되어있지 않다는 뜻이므로 False를 뱉으면서 종료될 수 있도록 한다.
코드
from collections import deque
def solution(s):
answer = True
s_queue = deque(list(s))
check = []
for i in range(len(s)):
if s_queue[0] == "(":
s_queue.popleft()
check.append("(")
elif s_queue[0] == ")":
if len(check) != 0:
s_queue.popleft()
check.pop()
else:
answer = False
break
if len(check) != 0:
answer = False
return answer
s = "()()"
solution(s)
'Algorithm' 카테고리의 다른 글
[프로그래머스] 튜플 (0) | 2022.08.28 |
---|---|
[프로그래머스] 수식 최대화 (0) | 2022.08.24 |
[프로그래머스] 두 큐 합 같게 만들기 (0) | 2022.08.20 |
[프로그래머스] 성격 유형 검사하기 (0) | 2022.08.18 |
[프로그래머스] 오픈채팅방 (0) | 2022.08.18 |