[백] 16637 괄호 추가하기

serotonins·2023년 4월 12일
0

Coding Q

목록 보기
13/17

문제가 간결해서 만만하게 봤다가 하루종일 골머리 싸맸다.

👀 구현 아이디어

첨에 문제 대충 읽고 괄호까지 다 주어지는 줄 알고 짰다가 많은 당황.
문제를 좀 제대로 읽으시길 바랍니다.

괄호치고 넘어갈지 그냥 넘어갈지 선택하고 다음 단계 또 호출하는 재귀로 풀어야할 거 같아서 너무 심하게 쫄았다.
(나는 재귀가 한번 복잡해지기 시작하면 제일 이해가 안 돼서 정말 두렵다.)

뒤에 괄호면 괄호째로 계산해서 저장해놓으면 되는데 괄호 아니면 부호만 저장해놨다가 그 뒤가 괄호가 아니면 숫자가 안 들어가버리는데 어쩌지, 그렇다고 뒤에 숫자도 저장해버리면 그때 괄호면 어떡함.
이 고민을 계속하다가 그냥 숫자 저장해놨다가 뒤에 괄호면 앞에 저장된 숫자를 지우면 되더라.

문제를 통찰해서 아주 기가 막힌 짧은 수식으로 끝내버리는 코드를 한번 봤다고 뭔가 그런 규칙을 찾아야만 할 거 같았는데(마이너스가 두번 나오면 뒤 마이너스는 괄호를 치는 게 어쩌구... 이런 생각하다가 시간 많이 날림) 그게 생각이 안 나면 이렇게 짜는 게 맞는 거다.

✔ 디버깅

  • 수식 받은 거에 숫자가 다 str 타입으로 들어오니까 자꾸 int로 생각하고 짠 코드에 오류 나는 짓을 반복했다.
    이런 문제에서는 타입을 먼저 잡아놓던가 하는 주의가 필요한 듯.

  • 막판에 n==1인 경우 생각 안 하고 냈다가 런타임에러(인덱스에러) 떴다.
    이걸 내가 못 찾고 질문게시판 읽어보다가 알아냈다.
    엣지케이스 알아내는 거 제발 훈련을 좀 하도록.

👀 코드

n = int(input())
susik = list(input())
buho = []
answer = []
for b in range(1, n, 2): buho.append(b)

def cal(a, b, _buho):
    if _buho == '+': return a + b
    elif _buho == '-': return a - b
    elif _buho == '*': return a * b

def mamuri(buho):
    answer.append([])
    answer[-1].append(susik[0])
    for h in range(len(buho)):
        mybuhoidx = 2 * h + 1
        if buho[h]:
            gwalho = cal(int(susik[mybuhoidx - 1]), int(susik[mybuhoidx + 1]), susik[mybuhoidx])
            del answer[-1][-1]
            answer[-1].append(gwalho)
        else: answer[-1] += [susik[mybuhoidx] , int(susik[mybuhoidx + 1])]

    ans = int(answer[-1][0])
    for j in range(1, len(answer[-1]), 2):
        ans = cal(ans, answer[-1][j+1], answer[-1][j])
    answer[-1] = ans

def dfs(buho, b, tf):
    buho[b] = tf

    if b == len(buho) - 1: # 마지막 부호면 식 계산 후 턴을 종료
        mamuri(buho)
        return

    if tf == True:
        buho[b+1] = False
        nextb = b+2
        if nextb >= len(buho):
            mamuri(buho)
            return
    else:
        nextb = b + 1

    dfs(buho, nextb, True)
    dfs(buho, nextb, False)

if n != 1:
    dfs(buho, 0, True)
    dfs(buho, 0, False)
else: answer = [int(susik[0])]

print(max(answer))

👀 사견

두통으로 머리가 계속 멍해서 생각이 논리적으로 전개가 안 되는 게 너무 답답했다.
컨디션이 늘 좋을 수는 없으니 이럴 때 마음 잡을 수 있도록 훈련을 많이 하자.
컨디션 난조면 오히려 좋아, 훈련 기회임 하는 마인드를 가지자.

0개의 댓글