티스토리 뷰
Algorithm/Implementation
(Python) - 프로그래머스(2020 KAKAO BLIND RECRUITMENT) : 괄호 변환
하눤석 2022. 1. 19. 09:30728x90
https://programmers.co.kr/learn/courses/30/lessons/60058
- 해설 :
'(' 과 ')'의 개수가 같다면 이를 '균형잡힌 괄호 문자열' 이라고 부른다. 또한, 균형잡힌 괄호 문자열이면서 '(' 과 ')'의 열고 닫는 짝이 맞다면 이를 '올바른 괄호 문자열' 이라고 부른다. 균형잡힌 괄호 문자열이 주어질 때 이를 올바른 괄호 문자열로 변환해서 반환하면 된다.
- 풀이 :
프로그래머스에서 이 문제를 level 2로 판단하였는데 개인적으로 level 3이여도 충분한 문제라고 생각한다. 우선 문제를 이해하는데에 시간이 오래 걸린다. 또한, 구현해야 하는 로직이 여러개이고 하나라도 틀에 벗어난다면 완전히 다른 정답값이 출력되기 때문이다. 우선 재귀적으로 함수를 수행하게 만들고 올바른 괄호 문자열인지 판별하는 함수와
두 개의 균형잡힌 괄호 문자열로 변환하는 함수,
4-1. 빈 문자열에 첫 번째 문자로 '('를 붙입니다.
4-2. 문자열 v에 대해 1단계부터 재귀적으로 수행한 결과 문자열을 이어 붙입니다.
4-3. ')'를 다시 붙입니다.
4-4. u의 첫 번째와 마지막 문자를 제거하고, 나머지 문자열의 괄호 방향을 뒤집어서 뒤에 붙입니다.
4-5. 생성된 문자열을 반환합니다.
의 과정을 수행하는 함수, 총 3개를 구현하였다.
이후 재귀적으로 이를 실행하며 올바른 괄호 문자열인지 체크하면서 진행하도록 구현하였다.
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
|
def correct(s):
cnt = 0
for i in s:
if i == "(":
cnt += 1
else:
cnt -= 1
if cnt < 0:
return False
return cnt == 0
def divide(s):
cnt = 0
u = []
v = []
for idx,i in enumerate(s):
u.append(i)
if i == "(":
cnt += 1
else:
cnt -= 1
if cnt == 0:
break
for i in range(idx+1,len(s)):
v.append(s[i])
return [''.join(u),''.join(v)]
def rev(s):
ret = ""
dic = {
"(" : ")",
")" : "("
}
for i in s:
ret += dic[i]
return ret
def dfs(s):
if correct(s):
return s
u,v = divide(s)
if correct(u):
return u+dfs(v)
else:
return "(" + dfs(v) + ")" + rev(u[1:-1])
def solution(p):
if p == "":
return ""
answer = dfs(p)
return answer
|
cs |
320x100
'Algorithm > Implementation' 카테고리의 다른 글
(Python) - 프로그래머스 (2018 KAKAO BLIND RECRUITMENT) : [1차] 뉴스 클러스터링 (0) | 2022.01.19 |
---|---|
(Python) - 프로그래머스 (2019 KAKAO BLIND RECRUITMENT) : 실패율 (0) | 2022.01.19 |
(Python) - 프로그래머스(2021 KAKAO BLIND RECRUITMENT) : 메뉴 리뉴얼 (0) | 2022.01.18 |
(Python) - 프로그래머스 : 행렬 테두리 회전하기 (0) | 2022.01.18 |
(Python) - 프로그래머스 : 완주하지 못한 선수 (0) | 2022.01.17 |
댓글
© 2022 WonSeok, All rights reserved