- 문제 : https://school.programmers.co.kr/learn/courses/30/lessons/76502
문제 이해
stack으로 0번째 인덱스를 끝으로 옮기면서 만들어진 리스트에서 완전한 괄호의 갯수를 반환하는 것으로 이해했다.
1. 괄호가 완전한지 알아야해서 check() 함수를 따로 만들었다
2. 이는 스택을 이용해서 탐색하는 문자와 stack의 끝 문자가 올바른 괄호가 되면 스택에서 왼쪽 괄호를 없앤다
3. 전체가 올바른 괄호가 된다면 스택에 더이상 원소가 없을 때 조건을 만족하므로 answer += 1 해준다
4. 괄호를 회전한다(0번째 인덱스 오른쪽 끝으로 이동시키기)
- 정답 풀이 :
def solution(s):
answer = 0
temp = list(s)
for _ in range(len(s)):
st = []
for i in range(len(temp)):
if len(st) > 0:
if st[-1] == '[' and temp[i] == ']':
st.pop()
elif st[-1] == '(' and temp[i] == ')':
st.pop()
elif st[-1] == '{' and temp[i] == '}':
st.pop()
else:
st.append(temp[i])
else:
st.append(temp[i])
if len(st) == 0:
answer += 1
temp.append(temp.pop(0))
return answer
- 시도해본 풀이 :
테스트 14번 하나만 계속 틀렸던 풀이다. 한 문제때문에 삽질한거 스트레스 받네
특정 리스트에서 (), {}, [] 각각이 올바른 괄호를 만드는지 확인한다
count는 왼쪽의 갯수이고, 올바른 괄호가 만들어질 때마다 하나씩 줄어든다
각 경우에 왼쪽이 없을 때 오른쪽이 나오면 올바른 괄호가 아니니까 False로 만들고
왼쪽이 있을 때 오른쪽이 나오면 count를 줄인다
def check(stack, left, right):
flag = True
count = 0
for i in range(len(stack)):
if stack[i] == left:
count += 1
elif stack[i] == right:
if count == 0:
flag = False
break
else:
count -= 1
return flag
def solution(s):
n = len(s)
stack = list(s)
small_l, small_r = stack.count('('), stack.count(')')
mid_l, mid_r = stack.count('{'), stack.count('}')
big_l, big_r = stack.count('['), stack.count(']')
if (small_l != small_r) or (mid_l != mid_r) or (big_l != big_r):
return 0
else:
answer = 0
while n > 0 :
x = stack.pop(0)
stack.append(x)
#stack 올바른지 확인하는 함수 구현
if (check(stack, '(', ')')) and (check(stack, '{', '}')) and (check(stack, '[', ']')):
answer += 1
n -= 1
return answer
'코딩테스트 > 기출' 카테고리의 다른 글
[2019 카카오 개발자 겨울 인턴십/ 프로그래머스] 64065번 : 튜플 (0) | 2022.09.16 |
---|---|
[/ 프로그래머스] 17680번 : [1차] 캐시 (0) | 2022.09.12 |
[연습문제 / 프로그래머스] 12949번 : 행렬의 곱셈 (1) | 2022.09.11 |
[Summer/Winter Coding(~2018) / 프로그래머스] 12980번 : 점프와 순간이동 (0) | 2022.09.11 |
[2017 팁스타운 / 프로그래머스] 12985번 : 예상 대전 (0) | 2022.09.11 |