[구현] PRG 60058: 괄호 변환

LeeJE20·2021년 9월 6일
0

파이썬 문제풀이

목록 보기
20/26

사용 언어: python 3.9.5

❓ Problem

문제 설명

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

난이도

level 2

🚩 Solution

시도 01)

1. 접근법

그냥 하라는 대로 하면 된다.

2. 코드

def balance(p):
    # 1. 입력이 빈 문자열인 경우, 빈 문자열을 반환합니다. 
    if p == "":
        return ""

    # 2. 문자열 w를 두 "균형잡힌 괄호 문자열" u, v로 분리합니다. 
    idx = 0
    count = 0

    if p[idx] == '(':
        count += 1
    else:
        count -= 1
    idx += 1

    # 올바른 괄호 문자열인지
    # 실수: )(인 경우 
    correct = True if count > 0 else False

    while count != 0:
        if p[idx] == '(':
            count += 1
        else:
            count -= 1
        if count < 0:
            correct = False
        idx += 1
    # idx는 v의 시작 인덱스가 된다.

    u = p[:idx]
    if correct:
        return u+balance(p[idx:])
    else:
        tmp = "("
        tmp += balance(p[idx:])
        tmp += ")"
        u = u[1:-1]
        for i in u:
            if i == "(":
                tmp += ")"
            else:
                tmp += "("
        return tmp

def solution(p):
    if p == "":
        return ""

    return balance(p)

3. 시간복잡도

O(n)O(n)

4. 결과

성공

5. 소요 시간

34분 30초

📕 피드백

1. 검색한 내용

2. 실수

while문의 예외상황에 대해 처리하지 못했다.

결론: 처음 3개 값, 마지막 3개값에 대한 예외상황은 항상 주의깊게 살피자.

3. 발전 방향 (개선/추가사항)

처음에 구현하는 문제인 것을 깨닫고, 구현 뒷 부분을 안 읽고 바로 구현에 들어갔다.

나중에 구현 뒷 부분을 읽어보니 재귀로 풀어야 하는 문제였다.

일반함수로 생각하고 있다가 갑자기 재귀로 바꾸려니 힘들었다.

결론: 문제는 알 것 같아도 다 읽고 풀자.

4. 다른 사람 풀이

풀이1)

  • 링크

https://programmers.co.kr/learn/courses/30/lessons/60058/solution_groups?language=python3

  • 접근법
  • 배울 점

람다를 써서 괄호 처리를 간단히 할 수 있다.

하나하나마다 간단한 함수를 적용시켜야 한다면 람다로 사용할 수 있음을 유념해두자.

0개의 댓글