Just Fighting
[프로그래머스] 괄호 변환 본문
https://programmers.co.kr/learn/courses/30/lessons/60058
코딩테스트 연습 - 괄호 변환
카카오에 신입 개발자로 입사한 "콘"은 선배 개발자로부터 개발역량 강화를 위해 다른 개발자가 작성한 소스 코드를 분석하여 문제점을 발견하고 수정하라는 업무 과제를 받았습니다. 소스를
programmers.co.kr
<문제 설명>
'('와 ')'의 개수가 같음 -> 균형잡힌 괄호 문자열
'('와 ')'의 짝까지 맞음 -> 올바른 괄호 문자열
균형잡힌 괄호 문자열을 올바른 괄호 문자열로 바꾸는 것이 문제다!
@ 규칙
1. 입력이 빈 문자열인 경우, 빈 문자열을 반환합니다.
2. 문자열 w를 두 "균형잡힌 괄호 문자열" u, v로 분리합니다. 단, u는 "균형잡힌 괄호 문자열"로 더 이상 분리할 수 없어야 하며, v는 빈 문자열이 될 수 있습니다.
3. 문자열 u가 "올바른 괄호 문자열" 이라면 문자열 v에 대해 1단계부터 다시 수행합니다.
3-1. 수행한 결과 문자열을 u에 이어 붙인 후 반환합니다.
4. 문자열 u가 "올바른 괄호 문자열"이 아니라면 아래 과정을 수행합니다.
4-1. 빈 문자열에 첫 번째 문자로 '('를 붙입니다.
4-2. 문자열 v에 대해 1단계부터 재귀적으로 수행한 결과 문자열을 이어 붙입니다.
4-3. ')'를 다시 붙입니다.
4-4. u의 첫 번째와 마지막 문자를 제거하고, 나머지 문자열의 괄호 방향을 뒤집어서 뒤에 붙입니다.
4-5. 생성된 문자열을 반환합니다.
<문제 이해>
문제가 잘 이해가 안돼서 문제 이해하는데 시간이 엄청 오래 걸렸다,,
근데 문제에 써있는 고대로 푸니 풀리는 매직,,,
일단 문자열이 비었으면 빈 문자열을 리턴하도록 했다.
빈 문자열이 아니라면 먼저 맨 앞에 있는 균형잡힌 괄호 문자열을 찾았고,
그 문자열이 '('로 시작된다면 무조건 올바른 괄호 문자열이고,
')'로 시작된다면 올바른 괄호 문자열이 아니라고 생각했다.
그 뒤는 규칙과 똑같이 풀었다.
<문제 풀이>
def solution(p):
if p == '' : return p # 빈 문자열이면 그대로 return
u = '' # u
cnt = 0
for i in p: # 맨 앞에 있는 균형잡힌 문자열을 찾는다.
if i=='(' : cnt +=1 # '('와 ')'의 개수가 같으면 균형잡힌 문자열
else : cnt -= 1
u += i
if cnt == 0: break
v = p[len(u):] # v
if u[0] == '(' : return u + solution(v) # 규칙 3
else:
temp = '(' + solution(v) + ')' # 규칙 4
if len(u) > 2:
temp += ''.join(['(' if x==')' else ')' for x in u[1:len(u)-1]])
return temp
<풀이 개선>
if i == '(' : cnt += 1
else: cnt -= 1
cnt += 1 if i == '(' else -1
간단한 if-else 문을 한줄로 바꿔쓸 줄 아니까 바꿔서 쓰면 좋겠다 ㅎㅎ
<배운 내용>
temp += ''.join(['(' if x==')' else ')' for x in u[1:len(u)-1]])
일단 배열에 있는 값들을 하나의 문자열로 합치는데에
''.join()을 하면 된다는 것을 저번에 깨닫고 아주 잘 쓰고 있다 ㅎㅎ
오늘은 이거 말고 배열 안에 if문과 for문을 함께 쓴것이 중점이다.
저 코드의 의미는
배열 u의 첫번째와 마지막을 제외한 값이 ')'면 배열에 '('을 넣고,
'('면 ')'를 배열에 넣겠다는 것이다.
시간이 너무 오래걸린다
그것도 아주많이☆
'Algorithm > 코딩테스트 연습' 카테고리의 다른 글
[프로그래머스] 실패율 (0) | 2022.01.31 |
---|---|
[프로그래머스] 순위 검색 (0) | 2022.01.26 |
[프로그래머스] 메뉴 리뉴얼 (0) | 2022.01.21 |
[프로그래머스] 양궁대회 (0) | 2022.01.20 |
[프로그래머스] 주차 요금 계산 (0) | 2022.01.19 |