반응형
프로그래머스: 괄호 변환
*프로그래머스 래벨이 올라갈수록 구현하기 귀찮은 문제들이 많은것 같네요 ㅠㅠ
문제풀러가기
https://programmers.co.kr/learn/courses/30/lessons/60058?language=python3
문제 분석
이 문제는 문제를 잘 읽고, 문제대로 따라서 코드를 작성하면 됩니다.
코드
def correct(p):
string = ""
for i in p:
if len(string)==0:
string += i
continue
if string[-1]=="(" and i==")":
string=string[:-1]
else:
string+=i
if len(string)==0:
return True
return False
def balanced(p):
num=0
string_b=""
for i in p:
if i=="(":
num+=1
else:
num-=1
string_b+=i
if num==0:
return len(string_b)
def change(p):
string=""
for i in p:
if i =="(":
string+=")"
else:
string+="("
return string
def solution(p):
if correct(p): return p
u,v = p[:balanced(p)],p[balanced(p):]
if correct(u):
result = u+solution(v)
else:
result=""
result="("+solution(v)+")"+change(u)[1:-1]
return result
코드 풀이
# <<correct(p)함수>>
#p가 올바른 괄호 문자열인지 확인하는 함수
#p에서 "("와 ")"가 올바르게 있을 경우,
# 올바른 괄호 쌍이 사라짐. 올바르지 않은 괄호 쌍은 남아있음.
# 문제에서, "1.입력이 빈 문자열인 경우, 빈 문자열을 반환합니다."
# len(string)==0 일때 return True이므로 빈 문자열은 빈문자열 그대로 반환해줌.
def correct(p):
string = ""
for i in p:
if len(string)==0:
string += i
continue
if string[-1]=="(" and i==")":
string=string[:-1]
else:
string+=i
if len(string)==0:
return True
return False
#<<balanced(p)함수>>
#p가 균형잡힌 문자열인지 확인하며,
#균형 잡힌 부분까지의 인덱스를 반환해주는 함수
#문제에서 "2.문자열 w를 두 '균형잡힌 괄호 문자열' u, v로 분리합니다."
#u,v로 나눠 주기 위해 균형잡힌 문자열 까지의 길이를 반환해준다.
def balanced(p):
num=0
string_b=""
for i in p:
if i=="(":
num+=1
else:
num-=1
string_b+=i
if num==0:
return len(string_b)
#<<change(p) 함수>>
#p의 괄호를 반대로 바꿔주는 함수
#문제에서 "4-4 나머지 문자열의 괄호 방향을 뒤집어서 뒤에 붙입니다. "
def change(p):
string=""
for i in p:
if i =="(":
string+=")"
else:
string+="("
return string
#메인 실행 함수
def solution(p):
if correct(p): return p #p가 올바른 문자열 일때 p를 반환
u,v = p[:balanced(p)],p[balanced(p):] #balanced함수를 통해 균형 잡힌 부분까지의 인덱스를 나눔
#u가 올바른 문자열일 경우, v를 재귀함수로 돌려주면
#v가 올바른 문자열이 될 때, result값을 반환함
if correct(u):
result = u+solution(v)
#u가 올바른 문자열이 아닐 경우,
else:
result=""
#문제에서 "4-1. 빈 문자열에 첫 번째 문자로 '('를 붙입니다." -> "("
#"4-2. 문자열 v에 대해 1단계부터 재귀적으로 수행한 결과 문자열을 이어 붙입니다." ->solution(v)
#"4-3. ')'를 다시 붙입니다." ->")"
#"4-4. u의 첫 번째와 마지막 문자를 제거하고, 나머지 문자열의 괄호 방향을 뒤집어서 뒤에 붙입니다."
#->change(u)[1:-1]
result="("+solution(v)+")"+change(u)[1:-1]
return result
반응형
'코딩테스트 > 코딩테스트 문제' 카테고리의 다른 글
코딩테스트 준비 - 프로그래머스:메뉴 리뉴얼 풀이/Counter,combinations (파이썬) (0) | 2021.07.02 |
---|---|
코딩테스트 준비 - 프로그래머스: 예상 대진표 풀이 (파이썬) (1) | 2021.07.01 |
코딩테스트 준비 - 프로그래머스: 행렬 테두리 회전하기 풀이(파이썬) (2) | 2021.06.30 |
코딩테스트 준비 - 프로그래머스:뉴스 클러스터링 풀이/isalpha() (파이썬) (0) | 2021.06.29 |
코딩테스트 준비 - 가장 큰 수: 풀이/2개의 방법 (파이썬) (0) | 2021.06.28 |
댓글