Skip to content

Commit 113c1b1

Browse files
committed
[PGS] 괄호변환 / Level 2 / 50분 / 힌트, 성공
1 parent ae22fcd commit 113c1b1

File tree

1 file changed

+62
-0
lines changed

1 file changed

+62
-0
lines changed
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
def sepatate_uv(p): # 문자열 p를 두 "균형잡힌 괄호 문자열" u, v로 분리
2+
3+
open_bracket = 0 # (
4+
close_bracket = 0 # )
5+
for i in range(len(p)):
6+
if p[i] == '(':
7+
open_bracket += 1
8+
else:
9+
close_bracket += 1
10+
11+
# 열린 괄호랑 닫힌 괄호랑 개수가 같아지는 순간 u문자열이랑 v문자열이 나뉨
12+
if open_bracket == close_bracket:
13+
# u, v순서로 반환
14+
return p[:i+1], p[i+1:]
15+
16+
17+
def check_correct_string(u): # 문자열 u가 "올바른 괄호 문자열"인지 판단
18+
# stack이 비어 있다면 올바른 거임
19+
stack = []
20+
21+
for c in u:
22+
if c == '(':
23+
stack.append(c)
24+
else:
25+
if not stack:
26+
return False
27+
stack.pop()
28+
29+
if stack:
30+
return False
31+
else:
32+
return True
33+
34+
def solution(p):
35+
answer = 0
36+
# 1. 입력이 빈 문자열인 경우, 빈 문자열을 반환합니다.
37+
if not p:
38+
return p
39+
40+
# 2. 문자열 w를 두 "균형잡힌 괄호 문자열" u, v로 분리합니다.
41+
u, v = sepatate_uv(p)
42+
# 3. 문자열 u가 올바른 문자열인지 판단
43+
if check_correct_string(u): # 참이면 문자열 v에 대해 1단계부터 다시 수행
44+
# 수행한 결과 문자열을 u에 이어 붙인 후 반환합니다.
45+
answer = u + solution(v)
46+
return answer
47+
48+
else: # 거짓이라면
49+
# 4-1. 빈 문자열에 첫 번째 문자로 '('를 붙입니다.
50+
answer = '('
51+
# 4-2. 문자열 v에 대해 1단계부터 재귀적으로 수행한 결과 문자열을 이어 붙입니다.
52+
answer += solution(v)
53+
# 4-3. ')'를 다시 붙입니다.
54+
answer += ')'
55+
# 4-4. u의 첫 번째와 마지막 문자를 제거하고, 나머지 문자열의 괄호 방향을 뒤집어서 뒤에 붙입니다.
56+
for c in u[1:len(u)-1]:
57+
if c == '(':
58+
answer += ')'
59+
else:
60+
answer += '('
61+
#4-5. 생성된 문자열을 반환합니다.
62+
return answer

0 commit comments

Comments
 (0)