해결된 질문
작성
·
100
0
몇 챕터/몇 강을 수강 중이신가요? 5-4. 카카오 신입 개발자 블라인드 채용 1차 코딩테스트 - 2
어떤 알고리즘을 학습하고 계신가요?
여기까지 이해하신 내용은 무엇인가요?
어느 부분에서 막히셨나요? W = "))()(" 케이스에 대해서, u와 v로 나누어야 하는데 u는 더이상 나눌 수 없는 균형잡힌 괄호 문자열이어야 된다고 했습니다, 하지만 해설로 제공해주신 풀이로 풀 때에는 W = "))()(" 가 애초에 균형잡힌 괄호 문자열이 아니기 때문에 u도 균형잡힌 괄호 문자열이 되지 않는다고 이해했습니다. (W의 문자열 길이가 홀수인 경우에는 )와 (가 모두 짝수 개수만큼 있을 수 없다고 생각했습니다.) 해당 문제의 원 링크에서 제공해주신 코드를 제출했을 땐 정답이 나오는데, 문제 설명 중에서 어떤 조건을 보고 W가 균형잡힌 문자열이 아닐 수도 있다는 것을 알수 있으며, u가 무조건 균형잡힌 문자열이 아니어도 된다는 것을 알 수 있는건가요?
코드의 어떤 로직이 이해가 안 되시나요?
어떤 개념이 헷갈리시나요?
문제 해결을 위해 어떤 시도를 해보셨나요? 제가 짠 코드와 제공해주신 해설 코드 중 차이점이 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로 분리합니다.
예시로 주신 "))()("
케이스를 봅시다:
이 문자열은 '('가 2개, ')'가 3개로 균형잡힌 괄호 문자열이 아닙니다.
따라서 이 문자열이 매개변수 p로 주어지는 경우는 문제의 조건에 맞지 않습니다.
문제는 균형잡힌 괄호 문자열 p가 주어졌을 때, 이를 올바른 괄호 문자열로 변환하는 알고리즘을 구현하는 것입니다. 따라서 W 는 반드시 균형잡힌 괄호 문자열이라고 가정하고 풀어야 할 것 같습니다!
아마 가희님께서 구현하신 코드를 보면,
코드에서 is_this_correct_parentheses
함수는 '균형잡힌 괄호 문자열'인지 확인합니다 (열린 괄호와 닫힌 괄호의 개수가 같은지).
하지만 루프에서 tmp_u = W[:i]
로 분리할 때, 이 부분 문자열이 균형잡힌 괄호 문자열인지 확인한 후 바로 break하면, "더 이상 분리할 수 없는" 조건을 만족시키지 못할 수 있습니다.
즉 제시된 코드는 균형잡힌 괄호 문자열을 올바르게 찾지 못하는 경우가 있어, 예시 "))()("
같은 입력에서 오류가 발생할 수 있습니다. 그런데 이 예시는 애초에 균형잡힌 괄호 문자열이 아니라서 문제의 전제 조건을 위반합니다.
실전에서는 이런 전제조건에 따라 구현방향성이 매우 갈리는 경우가 많아서, 전제조건에 맞춰서만 구현하는 것을 권장드립니다!
알고리즘 학습 시에는 "만약 이 전제조건이 깨지는 상황에서는 어떻게 하면 문제를 해결할 수 있을까?" 라는 가정을 열어보면서 문제를 해결해보시는 것도 좋을 것 같습니다! 요 관점에서 트라이해보신거라면
짱입니당