코딩테스트 연습 2020 KAKAO BLIND RECRUITMENT 괄호 변환 Python
🎁문제 링크
🎁문제 풀이
접근 순서
- 처음 주어지는 문자열은 모두 균형잡힌 괄호 문자열이다.
- 문자열 2개로 나누는 함수, 올바른 괄호 문자열인지 체크하는 함수 2가지를 만든다.
- 문제에 주어진 조건을 이용하여 구현한다.
- 입력이 빈 문자열인 경우, 빈 문자열을 반환합니다.
- 문자열 w를 두 "균형잡힌 괄호 문자열" u, v로 분리합니다. 단, u는 "균형잡힌 괄호 문자열"로 더 이상 분리할 수 없어야 하며, v는 빈 문자열이 될 수 있습니다.
- 문자열 u가 "올바른 괄호 문자열" 이라면 문자열 v에 대해 1단계부터 다시 수행합니다.
3-1. 수행한 결과 문자열을 u에 이어 붙인 후 반환합니다.
- 문자열 u가 "올바른 괄호 문자열"이 아니라면 아래 과정을 수행합니다.
4-1. 빈 문자열에 첫 번째 문자로 '('를 붙입니다.
4-2. 문자열 v에 대해 1단계부터 재귀적으로 수행한 결과 문자열을 이어 붙입니다.
4-3. ')'를 다시 붙입니다.
4-4. u의 첫 번째와 마지막 문자를 제거하고, 나머지 문자열의 괄호 방향을 뒤집어서 뒤에 붙입니다.
4-5. 생성된 문자열을 반환합니다.
- 처음 주어지는 문자열은 모두 균형잡힌 괄호 문자열이다.
- 문자열 2개로 나누는 함수, 올바른 괄호 문자열인지 체크하는 함수 2가지를 만든다.
- 문제에 주어진 조건을 이용하여 구현한다.
- 입력이 빈 문자열인 경우, 빈 문자열을 반환합니다.
- 문자열 w를 두 "균형잡힌 괄호 문자열" u, v로 분리합니다. 단, u는 "균형잡힌 괄호 문자열"로 더 이상 분리할 수 없어야 하며, v는 빈 문자열이 될 수 있습니다.
- 문자열 u가 "올바른 괄호 문자열" 이라면 문자열 v에 대해 1단계부터 다시 수행합니다.
3-1. 수행한 결과 문자열을 u에 이어 붙인 후 반환합니다. - 문자열 u가 "올바른 괄호 문자열"이 아니라면 아래 과정을 수행합니다.
4-1. 빈 문자열에 첫 번째 문자로 '('를 붙입니다.
4-2. 문자열 v에 대해 1단계부터 재귀적으로 수행한 결과 문자열을 이어 붙입니다.
4-3. ')'를 다시 붙입니다.
4-4. u의 첫 번째와 마지막 문자를 제거하고, 나머지 문자열의 괄호 방향을 뒤집어서 뒤에 붙입니다.
4-5. 생성된 문자열을 반환합니다.
- 입력이 빈 문자열인 경우, 빈 문자열을 반환합니다.
2. 문자열 2개로 나누는 함수, 올바른 괄호 문자열인지 체크하는 함수 2가지를 만든다.
# 문자열 2개로 나누는 함수
def cut(s):
left = 0
right = 0
for i in range(len(s)):
if s[i] == '(':
left += 1
else:
right += 1
if left == right:
return s[:i+1], s[i+1:]
왼쪽괄호와 오른쪽괄호를 개수를 세면서 진행하다 개수가 같아지면 균형이 맞는 상태이므로 이때 u와 v를 분리한다.
# 올바른 문자열인지 확인
def check(s):
stack = []
for i in s:
if i == '(':
stack.append(i)
else:
if not stack:
return False
stack.pop()
return True
스택을 활용하여 만약 '('를 만나면 스택에 삽입하고 ')'를 만난 경우, 스택에 '('가 있다면 pop을 하여 짝을 제거한다.
3. 문제에 주어진 조건을 이용하여 구현한다
if check(u):
# 3-1. 수행한 결과 문자열을 u에 이어 붙인 후 반환합니다.
return u + solution(v)
# 문자열 u가 "올바른 괄호 문자열"이 아니라면 아래 과정을 수행합니다.
else:
# 4-1. 빈 문자열에 첫 번째 문자로 '('를 붙입니다.
answer = '('
# 4-2. 문자열 v에 대해 1단계부터 재귀적으로 수행한 결과 문자열을 이어 붙입니다.
answer += solution(v)
# 4-3. ')'를 다시 붙입니다.
answer += ')'
# 4-4. u의 첫 번째와 마지막 문자를 제거하고, 나머지 문자열의 괄호 방향을 뒤집어서 뒤에 붙입니다.
for i in u[1:len(u) -1]:
if i == '(':
answer += ')'
else:
answer += '('
🎁전체 풀이 코드
# 문자열 2개로 나누기
def cut(s):
left = 0
right = 0
for i in range(len(s)):
if s[i] == '(':
left += 1
else:
right += 1
if left == right:
return s[:i+1], s[i+1:]
# 올바른 문자열인지 확인
def check(s):
stack = []
for i in s:
if i == '(':
stack.append(i)
else:
if not stack:
return False
stack.pop()
return True
def solution(p):
answer = ''
if p == '':
return ''
u, v = cut(p)
if check(u):
return u + solution(v)
else:
answer = '('
answer += solution(v)
answer += ')'
for i in u[1:len(u) -1]:
if i == '(':
answer += ')'
else:
answer += '('
return answer
Author And Source
이 문제에 관하여(코딩테스트 연습 2020 KAKAO BLIND RECRUITMENT 괄호 변환 Python), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://velog.io/@icarus_w/코딩테스트-연습2020-KAKAO-BLIND-RECRUITMENT괄호-변환
저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
# 문자열 2개로 나누기
def cut(s):
left = 0
right = 0
for i in range(len(s)):
if s[i] == '(':
left += 1
else:
right += 1
if left == right:
return s[:i+1], s[i+1:]
# 올바른 문자열인지 확인
def check(s):
stack = []
for i in s:
if i == '(':
stack.append(i)
else:
if not stack:
return False
stack.pop()
return True
def solution(p):
answer = ''
if p == '':
return ''
u, v = cut(p)
if check(u):
return u + solution(v)
else:
answer = '('
answer += solution(v)
answer += ')'
for i in u[1:len(u) -1]:
if i == '(':
answer += ')'
else:
answer += '('
return answer
Author And Source
이 문제에 관하여(코딩테스트 연습 2020 KAKAO BLIND RECRUITMENT 괄호 변환 Python), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@icarus_w/코딩테스트-연습2020-KAKAO-BLIND-RECRUITMENT괄호-변환저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)