Just Fighting

[프로그래머스] 괄호 변환 본문

Algorithm/코딩테스트 연습

[프로그래머스] 괄호 변환

yennle 2022. 1. 25. 16:02
728x90

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의 첫번째와 마지막을 제외한 값이 ')'면 배열에 '('을 넣고,

'('면 ')'를 배열에 넣겠다는 것이다.

 

 

 

 

시간이 너무 오래걸린다

그것도 아주많이☆

728x90
Comments