프로그래머스 / LEVEL2 / 괄호 회전하기 / python3
https://school.programmers.co.kr/learn/courses/30/lessons/76502#
문제설명
다음 규칙을 지키는 문자열을 올바른 괄호 문자열이라고 정의합니다.
- (), [], {} 는 모두 올바른 괄호 문자열입니다.
- 만약 A가 올바른 괄호 문자열이라면, (A), [A], {A} 도 올바른 괄호 문자열입니다. 예를 들어, [] 가 올바른 괄호 문자열이므로, ([]) 도 올바른 괄호 문자열입니다.
- 만약 A, B가 올바른 괄호 문자열이라면, AB 도 올바른 괄호 문자열입니다. 예를 들어, {} 와 ([]) 가 올바른 괄호 문자열이므로, {}([]) 도 올바른 괄호 문자열입니다.
대괄호, 중괄호, 그리고 소괄호로 이루어진 문자열 s가 매개변수로 주어집니다. 이 s를 왼쪽으로 x (0 ≤ x < (s의 길이)) 칸만큼 회전시켰을 때 s가 올바른 괄호 문자열이 되게 하는 x의 개수를 return 하도록 solution 함수를 완성해주세요.
제한사항
s의 길이는 1 이상 1,000 이하입니다.
입출력 예
접근방법
1. collections deque의 rotate를 이용하여 괄호 회전된 배열을 가져온다.
2. 반복문을 통해 문자열을 한개씩 가져온다.
3. 가져온 괄호 문자열을 statck에 append한다.
4. 만약 statck 의 최상단 값과 현재 괄호가 일치할 경우 -> ex) (), {}, []
pop연산을 통해 제거한다.
5. 반복문이 종료되었을때 statck이 비어있으면 정답에 1을 더해준다.
소스코드
정답 소스코드 보기(아래 더보기 눌러주세요.)
정답 소스코드
from collections import deque
def solution(s):
answer = 0
for i in range(len(s)):
queue = deque(s)
queue.rotate(i)
stack = []
while queue:
value = queue.popleft()
if len(stack) ==0: stack.append(value)
else:
if value ==")" and stack[-1] =="(": stack.pop()
elif value =="}" and stack[-1] =="{": stack.pop()
elif value =="]" and stack[-1] =="[": stack.pop()
else: stack.append(value)
if len(stack) == 0 :
answer +=1
return answer
처음에 짠 소스코드(틀린 소스코드)
틀린 소스코드
def solution(s):
answer = 0
checkDic = {"}": "{", "]": "[", ")": "("}
for i in range(len(s)):
queue = deque(s)
queue.rotate(i)
print(queue)
dic = {"{": 0, "[": 0, "(": 0}
trunYN = True
while queue:
value = queue.popleft()
if value in '{([':
dic[value] += 1
else:
if dic[checkDic[value]] == 0:
trunYN = False
break
else:
dic[checkDic[value]] -= 1
if trunYN and dic["{"] == 0 and dic["("] == 0 and dic["["] == 0:
answer += 1
return answer
Dict를 이용하여 괄호를 카운트하여 체크 하고자 하였다.
이 코드의 문제점은 " { ( } ) " 다음과 같이 짝이 옳지 않을경우 괄호의 순서를 체크할 수 없기 때문에 틀린 소스코드이다.