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

klean·2021년 2월 19일
0

프로그래머스 레벨2

목록 보기
13/13

문제 요약

https://programmers.co.kr/learn/courses/30/lessons/60058
괄호 '('와 ')'로 이루어진 문자열 p가 주어집니다.
'(' 와 ')' 의 개수가 같다면 이 문자열은 균형잡힌 문자열이라고 부르고
()의 중첩으로 이루어진, 아다리가 잘 맞아떨어지는 문자열을 올바른 문자열이라고 부릅니다.
문자열 p는 균형잡힌 문자열입니다. 우리가 친절하게 재귀적으로 p를 올바른 문자열로 만드는 방법을 알려줄 테니 너는 코딩만 하세요.

아이디어

2020하반기 카카오 공채에서 풀었던 1번 문제 유형을 떠올려보면...
정말 디테일하게 어떻게 해야하는지 알려주고 그걸 코드로 그냥 옮기기만 하면 됐다.
같은 유형임이 눈에 띄어서 최대한 설명을 베낀다 생각하고 짰다.

u가 균형잡힌 문자열인지, 팁

균형잡힌 문자열

생각보다 오래걸렸다...

  1. 나의 고질적인 카카오 문제 독해력... u v에 대해서 어디서 나누어야 하는가로 고민을 많이 했다.. 그냥 균형잡힌 문자열(처음으로 구해지는거) 하면 되는건데 나는 이런 세부적인 디테일을 놓치는 게 벌써 3번째다..
  2. python 쓰는 게 미숙해서 for c in list_a: 해놓고 list_a[c:] 같은 짓거리를 하였다...
  3. 그리고 그런 문제가 생겼으면 디버깅을 해야하는데 재귀 종류의 문제에 대해 어떻게 주석처리를 하고 print를 해야 하는지를 몰랐던 거 같다.
    다음에는 재귀적으로 파고 들어가는 하나의 케이스, 근데 좀 극단적으로 재귀에서 처리방법1이 반복되는?? 테스트 케이스를 만들고 처리방법1만 주석 풀어두고 나머지 주석하고 이런 식으로 해봐야겠다.

python 초보로서 잘한거

  1. string을 modify하면 안된다는 것을 기억해내고 리스트로 바로 변환한것
  2. 1.때문에 내가 해놓은 짓을 까먹지 않고 base조건에서도 리스트로 취급한것

코드 python

def rev(s):
    for i in range(len(s)):
        if s[i]=='(':
            s[i] = ')'
        else:
            s[i] = '('
    return s

def rec(s,d):
    if s ==[]:
        return []
    stck =0
    is_corr = True
    for i in range(len(s)):
        if s[i] == '(':
            stck+=1
        else:
            stck-=1
        if stck < 0:#음수로 떨어진 적이 있다면 올바르지 u가 올바르지 않아서임
            is_corr = False
        if stck ==0:
            u = s[0:i+1]
            v = s[i+1:]
            print("".join(u),"".join(v))
            if is_corr:
                #print(rec(v,d+1))
                return u + rec(v,d+1)
            
            else:
                return ['('] + rec(v,d+1)+[')']+rev(u[1:-1])

def solution(p):
    answer = ''
    answer = "".join(rec(list(p),0))
    return answer

0개의 댓글