본문 바로가기
Python3/프로그래머스

2022.06.07 [프로그래머스] (python 파이썬) 괄호 변환

by ian's coding 2022. 6. 7.
728x90
반응형

 

https://programmers.co.kr/learn/courses/30/lessons/60058

 

코딩테스트 연습 - 괄호 변환

카카오에 신입 개발자로 입사한 "콘"은 선배 개발자로부터 개발역량 강화를 위해 다른 개발자가 작성한 소스 코드를 분석하여 문제점을 발견하고 수정하라는 업무 과제를 받았습니다. 소스를

programmers.co.kr

 


풀이

문제를 풀기위해 먼저 두가지 함수를 만들었다. 

1. 올바른 괄호 문자열인지 판단하는 함수

2. 문자열을 u, v로 변환하는 함수

 

1번 함수에서 스택방식을 이용했는데 여는괄호가 나오면 arr에 저장하고 

닫는 괄호가 나왔을 때, 만약 arr이 비어있으면 짝이 맞지않기 때문에 False를 리턴하고

arr에 데이터가 들어있으면 하나씩 지워주는 방식을 사용했다.

그리고 for문이 정상적으로 끝나면 해당 문자열은 정상이기 때문에 True를 리턴했다.

 

2번 함수에서 u가 더 이상 분리되지 않는 균형잡힌 문자열인지 판단하기 위해 ch와 cnt를 이용했다.

만약 여는괄호가 추가되면 cnt+=1, 닫는 괄호면 cnt-=1을 해서 만약 cnt가 0이 되면 더 이상 분리되지 않는 균형잡힌 문자열이 되기 때문에 ch를 True로 바꾸고 다음 괄호부터 v에 저장했다.

 

이후 문제에서 주어진 순서대로 코드를 작성했다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
# 올바른 괄호 문자열인지 판단하는 함수
def checkstr(s):
    arr=[]
    for i in s:
        if i=="(":
            arr.append(i)
        else:
            if not arr:
                return False
            else:
                arr.pop(0)
    return True
 
# 문자열 u, v로 변환하는 함수
def divide(s):
    u,v="",""
    ch=False
    cnt=0
    for i in s:
        if not ch:
            if i=="(":
                cnt+=1
                u+=i
            else:
                cnt-=1
                u+=i
            if cnt==0:
                ch=True
        else:
            v+=i
    return u,v    
 
def solution(p):
    answer = ''
    # 1단계
    if not p:
        return p
    # 2단계
    u,v=divide(p)
    # 3단계
    if checkstr(u):
        return u + solution(v)
    # 4단계
    else:
        # 4-1 단계
        answer+="("
        # 4-2 단계
        answer+=solution(v)
        #4-3 단계
        answer+=")"
        # 4-4 단계
        for i in u[1:len(u)-1]:
            if i=="(":
                answer+=")"
            else:
                answer+="("
    # 4-5 단계
    return answer
cs

 

 

 

 

728x90
반응형

댓글