우기의 알 블로그 저자 한승욱이라고 합니다.
스스로 알을 깨고 나오는 새처럼
언젠가 알을 깨고 온전한 나 자신이 되었을 때, 그때를 기다리며 제 속에서 솟아 나오는 것을 글로써 표현하고자 합니다.
'개발 기술블로그'를 위주로 저 한승욱의 다양한 관심사, 생각, 철학 등을 포스팅합니다.
# 코드 스니펫from collections import deque
balanced_parentheses_string ="()))((()"defget_correct_parentheses(balanced_parentheses_string):returnprint(get_correct_parentheses(balanced_parentheses_string))# "()(())()"가 반환 되어야 합니다!
# 정답from collections import deque
balanced_parentheses_string ="()))((()"defis_correct_parenthesis(string):
stack =[]for s in string:if s =='(':
stack.append(s)elif stack:# 스택이 없을때 pop을 하면 에러가 나기에 조건문 필요. 스택이 비어있지 않고 존재할때
stack.pop()returnlen(stack)==0defreverse_parenthesis(string):
reversed_string =""for char in string:# 주의할점: 첫번째 문자 마지막 문자를 제거하라고 했으니 인덱싱 필요if char =="(":
reversed_string +=")"else:
reversed_string +="("return reversed_string
defseperate_to_u_v(string):
queue = deque(string)
left, right =0,0
u, v ="",""while queue:
char = queue.popleft()
u += char # 하나하나 꺼내면서 u에다 붙임if char =='(':
left +=1else:
right +=1if left == right:break# 멈추는 이유는 u는 균형잡힌 괄호 문자열로 더 이상 분리할 수 없어야 된다고 했기 때문에# 즉 더 이상 쌍이 안생기기로 멈추도록 만들어줘야함
v =''.join(list(queue))# '' 안에는 각 요소 중간중간에 무엇을 넣을지. 합쳐주는 것임# 나머지를 v에 넣어주는 것인데 왜 이게 균형잡힌 문자열이 될까? 왜냐면 애초에 균형잡힌 문자열만 넣어주기 때문이다.return u, v
defchange_to_correct_parenthesis(string):# 1. 입력된 빈 문자열인 경우, 빈 문자열 반환if string =="":return""# 2. 문자열 w를 두 "균형잡힌 괄호 문자열" u, v로 분리. 단 u는 "균형잡힌 괄호 문자열 더 이상 분리할수 없어야 하며# v는 빈 문자열이 될 수 있습니다.# "(" ")" 개수가 같아야 한다.
u, v = seperate_to_u_v(string)# 3. 문자열 u 가 "올바른 괄호 문자열"이라면# 문자열 v에 대해 1단계부터 다시 수행# 3-1. 수행한 결과 문자열을 u에 이어붙인뒤 반환# 즉 change_to_correct_parenthesis를 다시 수행(재귀적으로)if is_correct_parenthesis(u):return u + change_to_correct_parenthesis(v)# 4. 문자열 u가 "올바른 괄호 문자열"이 아니라면 아래 과정을 수행# 4-1. 빈 문자열에 첫 번째 문자로 ( 를 붙인다.# 4-2. 문자열 v에 대해 1단계부터 재귀적으로 수행한 결과를 이어붙인다.# 4-3. ) 를 다시 붙인다.# 4-4. u의 첫번째 문자와 마지막 문자를 제거하고, 나머지 문자열의 괄호 방향을 뒤집어서 뒤에 붙인다.else:return"("+ change_to_correct_parenthesis(v)+")"+ reverse_parenthesis(u[1:-1])# 주의할점: 첫번째 문자 마지막 문자를 제거하라고 했으니 인덱싱 필요defget_correct_parentheses(balanced_parentheses_string):if is_correct_parenthesis(balanced_parentheses_string):return balanced_parentheses_string
else:return change_to_correct_parenthesis(balanced_parentheses_string)print(get_correct_parentheses(balanced_parentheses_string))# "()(())()"가 반환 되어야 합니다!
알고리즘 실전 - 2020 카카오 신입 개발자 블라인드 채용 1차 코딩테스트 - 2
올바른 괄호 문자열 만들기
문제에 해결방법이 다 나와있는 문제이다.
차근차근 해당 문제를 보며 구현하면 되는 것이다.
균형잡힌 괄호 문자열 → 올바른 괄호 문자열
'기술개발 > Algorithm' 카테고리의 다른 글