티스토리 뷰
● 문제 링크
코딩테스트 연습 - 괄호 회전하기
programmers.co.kr
● 문제 설명
다음 규칙을 지키는 문자열을 올바른 괄호 문자열이라고 정의합니다.
- (), [], {} 는 모두 올바른 괄호 문자열입니다.
- 만약 A가 올바른 괄호 문자열이라면, (A), [A], {A} 도 올바른 괄호 문자열입니다. 예를 들어, [] 가 올바른 괄호 문자열이므로, ([]) 도 올바른 괄호 문자열입니다.
- 만약 A, B가 올바른 괄호 문자열이라면, AB 도 올바른 괄호 문자열입니다. 예를 들어, {} 와 ([]) 가 올바른 괄호 문자열이므로, {}([]) 도 올바른 괄호 문자열입니다.
대괄호, 중괄호, 그리고 소괄호로 이루어진 문자열 s가 매개변수로 주어집니다. 이 s를 왼쪽으로 x (0 ≤ x < (s의 길이)) 칸만큼 회전시켰을 때 s가 올바른 괄호 문자열이 되게 하는 x의 개수를 return 하도록 solution 함수를 완성해주세요.
제한사항
- s의 길이는 1 이상 1,000 이하입니다.
● 문제 해결 방향
초기 : {, [ ( 에 대해서 dict를 사용해서 count를 해주고, 그에 적합한 짝 }, ], )이 왔을 때 count를 하나씩 깎아준다.
초기 아이디어의 경우 '{ [ } ]'와 같이 (A)와 같이 바깥의 괄호 안의 문자열이 올바른 괄호 문자열이 아닌 경우에도 통과로 처리해버리는 오류가 있어 다음과 같이 아이디어를 전환했다.
후기 : '()', '[]', '{}'를 ''로 replace 해주면서 마지막에 남은 문자열에 대해서 true, false를 판단
● 문제 해결 코드
- 초기 올바른 괄호 문자열 검증 코드
def check(s):
if s[0] in [']', ')', "}"]:
return False
arr = {
'[' : 0,
'(' : 0,
'{' : 0
}
for i in s:
if i in ['[', '(', '{'] :
arr[i] += 1
else :
if i == ']':
if arr['['] == 0:
return False
else :
arr['['] -= 1
if i == ')':
if arr['('] == 0:
return False
else :
arr['('] -= 1
if i == '}':
if arr['{'] == 0:
return False
else :
arr['{'] -= 1
if sum(arr.values()) != 0 :
return False
return True if sum(arr.values()) == 0 else False
우선 오른쪽 끝에 여는 괄호, 왼쪽 끝에 닿는 괄호가 있는 경우 -> false
여는 괄호에 대해서 dict에 카운트를 해주고, 그에 맞는 짝이 들어올 경우 dict 카운트로 깎아준다.
문자열 모두 검증 후에 dict 내 모든 value의 합이 0일 때 True를 return 한다.
중도에 여는 괄호가 들어오지 않았는데 닫는 괄호가 들어오는 경우에도 false 처리해준다.
이 코드의 경우 '([)]' 일 때 True를 return 해주어서 오류가 있다.
이후 수정한 코드
def check(s):
if s(len) % 2 == 1 : return False
for i in range(int(len(s) / 2)):
s = s.replace('()', '')
s = s.replace('{}', '')
s = s.replace('[]', '')
if s == '':
return True
return True if s == '' else False
def solution(s):
answer = 0
for i in range(len(s)):
if check(s) :
answer += 1
s = s[1:] + s[0]
return answer
check()
문자열의 길이가 홀수인 경우 false를 리턴해준다.
그리고 반복적으로 '[]', '()', '{}'를 없애주면서 마지막에 문자열이 남지 않을 때 True를 Return 한다.
이때 반복 횟수는 괄호 1쌍의 길이가 2이기 때문에
최대 len(문자열)/2 회 돌았을 때 올바른 문자열이면 모두 괄호가 없어져야 한다고 생각한다.
solution()
문자열을 회전시키면서 문자열에 대해서 올바른 괄호 문자열인지 check 한다.
● 알게 된 것 / 아쉬운 점
'PYTHON' 카테고리의 다른 글
[프로그래머스/PYTHON] 피로도 (1) | 2022.01.14 |
---|---|
[프로그래머스/PYTHON] 큰 수 만들기 (0) | 2022.01.12 |
[프로그래머스/PYTHON] 2개 이하로 다른 비트 (0) | 2022.01.10 |
[프로그래머스/PYTHON] 프린터 (0) | 2022.01.10 |
[프로그래머스/PYTHON] [카카오 인턴] 수식 최대화 (0) | 2022.01.09 |
- Total
- Today
- Yesterday
- React
- Vue
- Preloading
- TypeScript
- GraphQL
- programmers
- Vue.js
- redux-thunk
- AxiosInterceptor
- python
- 문제풀이
- bundler
- js
- SOAP API
- Vuex
- reactrouter
- SPA
- 백준
- clean code
- v-for
- redux
- Transpiler
- 파이썬
- webpack
- 상호평가
- 프로그래머스
- Repository Pattern
- error
- 알고리즘
- React.memo
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 |