티스토리 뷰

반응형

 문제

 

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

 

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

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

programmers.co.kr

 

 

 

 문제 상황

 

- 괄호의 묶음을 입력받아 처리하는 로직을 알려주고 그것을 구현하는 문제

 

 

 

 해결 전략

 

- 문제를 이해하고 그대로 구현하면 된다.

 

 

 

 코드

 

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
# 45분
# 균형 잡힌 문자열로 분리
def balenced(p):
    # "(", ")"
    check = [0,0]
    for i in range(len(p)):
        if p[i] == "(": check[0+= 1
        else : check[1+= 1
        if check[0== check[1]: return p[:i+1], p[i+1:]
    return p, ""
# 올바른 문자열인지 확인하는 함수
def correct(p):
    stack = []
    for i in range(len(p)):
        if p[i] == "(":
            stack.append("(")
        else:
            if not stack: return False
            else : stack.pop()
    # 다 돌았는데 stack이 남았으면 거짓, stack이 없으면 True
    if stack : return False
    return True
 
# 4-4를 구현
def cutting(u):
    # 만약 길이가 2보다 작으면 앞 뒤를 자를 수 없다.
    if len(u) < 2 :
        return ""
    else:
        u = u[1:-1]
        for i in range(len(u)):
            if u[i] == "("
                u = u[:i] + ")" + u[i+1:]
                print(u)
            else
                u = u[:i] + "(" + u[i+1:]
                # print(u)
    return u
 
def solution(p):
    if p == ""return ""
    # 균형잡힌 문자열로 분리
    u, v = balenced(p)
    # 만약 u가 올바른 문자열이면
    if correct(u): return u + solution(v)
    # u가 올바른 문자열이 아니라면
    else:
        return "(" + solution(v) + ")" + cutting(u)
cs

 

 

 

 해설

 

- 주어진 문제 상황을 그대로 구현하면 된다.

 

 

 

 새로 학습한 것 & 실수 

 

- 대입을 해야하는데 =가 아니라 ==를 써넣어 찾는데 문제를 푸는 시간보다 더 오래걸렸다.

 

- 대입할 때, 같은지 확인할 때 부호를 꼼꼼하게 확인한다.

 

- p를 넣었을 때 p에 u를 추출할 수 없는 경우 v를 공백처리해주고 모든 요소를 p에 넣는 경우를 생각하지 못했다. 마지막에 return문을 안넣으면 위와 같은 상황에 None이 출력된다.

 

 

 

반응형
댓글