File tree Expand file tree Collapse file tree 1 file changed +62
-0
lines changed
Expand file tree Collapse file tree 1 file changed +62
-0
lines changed Original file line number Diff line number Diff line change 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
You can’t perform that action at this time.
0 commit comments