인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

이가희님의 프로필 이미지

작성한 질문수

38군데 합격 비법, 2024 코딩테스트 필수 알고리즘

5-4. 카카오 신입 개발자 블라인드 채용 1차 코딩테스트 - 2

5-4. 카카오 신입 개발자 블라인드 채용 1차 코딩테스트 - 2 질문입니다.

해결된 질문

작성

·

100

0

1. 현재 학습 진도

  • 몇 챕터/몇 강을 수강 중이신가요? 5-4. 카카오 신입 개발자 블라인드 채용 1차 코딩테스트 - 2

  • 어떤 알고리즘을 학습하고 계신가요?

  • 여기까지 이해하신 내용은 무엇인가요?

 

2. 어려움을 겪는 부분

  • 어느 부분에서 막히셨나요? W = "))()(" 케이스에 대해서, u와 v로 나누어야 하는데 u는 더이상 나눌 수 없는 균형잡힌 괄호 문자열이어야 된다고 했습니다, 하지만 해설로 제공해주신 풀이로 풀 때에는 W = "))()(" 가 애초에 균형잡힌 괄호 문자열이 아니기 때문에 u도 균형잡힌 괄호 문자열이 되지 않는다고 이해했습니다. (W의 문자열 길이가 홀수인 경우에는 )와 (가 모두 짝수 개수만큼 있을 수 없다고 생각했습니다.) 해당 문제의 원 링크에서 제공해주신 코드를 제출했을 땐 정답이 나오는데, 문제 설명 중에서 어떤 조건을 보고 W가 균형잡힌 문자열이 아닐 수도 있다는 것을 알수 있으며, u가 무조건 균형잡힌 문자열이 아니어도 된다는 것을 알 수 있는건가요?

  • 코드의 어떤 로직이 이해가 안 되시나요?

  • 어떤 개념이 헷갈리시나요?

 

3. 시도해보신 내용

  • 문제 해결을 위해 어떤 시도를 해보셨나요? 제가 짠 코드와 제공해주신 해설 코드 중 차이점이 W를 u와 v로 나누는 부분에 있음을 알게되었고, 제 코드는 W가 무조건 균형잡힌 괄호 문자열인 경우에 대해서만 풀리게 되어있습니다.

  • 에러가 발생했다면 어떤 에러인가요?

from collections import deque

def is_this_correct_parentheses(string):

    N = len(string)

    left_parentheses_num = 0
    for s in string:
        if s == "(":
            left_parentheses_num += 1

    if left_parentheses_num == N-left_parentheses_num:
        return 1
    else:
        return 0

def is_this_balanced_parentheses(string):
    stack = []
    stack.append(string[0])
    string = string[1:]
    for s in string:
        tmp = s
        if len(stack) != 0 and stack[-1] == "(" and tmp == ")":
            stack.pop()
        else:
            stack.append(tmp)

    if len(stack) == 0:
        return 1
    else:
        return 0

def u_string_processing(u):
    u = u[1:-1]
    tmp_u = ""
    for i in range(len(u)):
        if u[i] == "(":
            tmp_u += ")"
        else:
            tmp_u += "("
    return tmp_u


def get_correct_parentheses(balanced_parentheses_string):

    W = balanced_parentheses_string

    if W == "":
        return ""

    idx = 0
    for i in range(1, len(W)):
        tmp_u = W[:i]
        if is_this_correct_parentheses(tmp_u) == 1:
            idx = i
            break
    if len(W) == 2:
        idx = 2
    u = W[:idx]
    v = W[idx:]

    if is_this_balanced_parentheses(u) == 1:
        processed_v = get_correct_parentheses(v)
        return u+processed_v
    elif is_this_balanced_parentheses(u) == 0:
        tmp_string = "("
        processed_v = get_correct_parentheses(v)
        tmp_string += (processed_v + ")")
        tmp_string += u_string_processing(u)
        return tmp_string

    return W

 

이렇게 구체적으로 알려주시면, 더 정확하고 도움이 되는 답변을 드릴 수 있습니다! 😊

답변 1

0

딩코딩코님의 프로필 이미지
딩코딩코
지식공유자

안녕하세요 가희님! 좋은 질문 주셔서 감사합니다!!

 

먼저, 문제의 핵심 부분을 다시 살펴보겠습니다.

  • 매개변수로 주어지는 p는 균형잡힌 괄호 문자열입니다.

  • 알고리즘 내에서 w를 분리할 때는 '균형잡힌 괄호 문자열'인 u와 나머지 v로 분리합니다.

예시로 주신 "))()(" 케이스를 봅시다:

  1. 이 문자열은 '('가 2개, ')'가 3개로 균형잡힌 괄호 문자열이 아닙니다.

  2. 따라서 이 문자열이 매개변수 p로 주어지는 경우는 문제의 조건에 맞지 않습니다.

문제는 균형잡힌 괄호 문자열 p가 주어졌을 때, 이를 올바른 괄호 문자열로 변환하는 알고리즘을 구현하는 것입니다. 따라서 W 는 반드시 균형잡힌 괄호 문자열이라고 가정하고 풀어야 할 것 같습니다!

 

아마 가희님께서 구현하신 코드를 보면,

코드에서 is_this_correct_parentheses 함수는 '균형잡힌 괄호 문자열'인지 확인합니다 (열린 괄호와 닫힌 괄호의 개수가 같은지).

하지만 루프에서 tmp_u = W[:i]로 분리할 때, 이 부분 문자열이 균형잡힌 괄호 문자열인지 확인한 후 바로 break하면, "더 이상 분리할 수 없는" 조건을 만족시키지 못할 수 있습니다.

 

즉 제시된 코드는 균형잡힌 괄호 문자열을 올바르게 찾지 못하는 경우가 있어, 예시 "))()(" 같은 입력에서 오류가 발생할 수 있습니다. 그런데 이 예시는 애초에 균형잡힌 괄호 문자열이 아니라서 문제의 전제 조건을 위반합니다.

 

실전에서는 이런 전제조건에 따라 구현방향성이 매우 갈리는 경우가 많아서, 전제조건에 맞춰서만 구현하는 것을 권장드립니다!

 

알고리즘 학습 시에는 "만약 이 전제조건이 깨지는 상황에서는 어떻게 하면 문제를 해결할 수 있을까?" 라는 가정을 열어보면서 문제를 해결해보시는 것도 좋을 것 같습니다! 요 관점에서 트라이해보신거라면
짱입니당