코딩테스트

[백준][브루트포스] 괄호 추가하기

pythaac 2022. 5. 2. 22:31
BAEKJOON Online Judge(BOJ) 문제입니다.

https://www.acmicpc.net/

 

Baekjoon Online Judge

Baekjoon Online Judge 프로그래밍 문제를 풀고 온라인으로 채점받을 수 있는 곳입니다.

www.acmicpc.net

 

문제

https://www.acmicpc.net/problem/16637

 

16637번: 괄호 추가하기

첫째 줄에 수식의 길이 N(1 ≤ N ≤ 19)가 주어진다. 둘째 줄에는 수식이 주어진다. 수식에 포함된 정수는 모두 0보다 크거나 같고, 9보다 작거나 같다. 문자열은 정수로 시작하고, 연산자와 정수가

www.acmicpc.net

 

내가 작성한 코드

mx = -float('inf')

def read_data():
    N = int(input().rstrip())
    equation = input().rstrip()
    operand = []
    operation = []
    for i, v in enumerate(equation):
        if i % 2 == 0:
            operand.append(int(v))
        else:
            operation.append(v)

    return operation, operand

def op(a, b, x):
    if x == '+':
        return a+b
    elif x == '-':
        return a-b
    else:
        return a*b

def do(operand, operation, i):
    a, b, x = operand[i], operand[i+1], operation[i]
    v = op(a, b, x)

    operand.pop(i)
    operand.pop(i)
    operand.insert(i, v)
    operation.pop(i)

    return a, b, x

def undo(operand, operation, i, a, b, x):
    operand.pop(i)
    operand.insert(i, b)
    operand.insert(i, a)
    operation.insert(i, x)

def fin(operand, operation):
    global mx
    _operand, _operation = [], []
    for _ in range(len(operation)):
        a, b, x = do(operand, operation, 0)
        _operand.append(a)
        _operand.append(b)
        _operation.append(x)
    mx = max(mx, operand[0])
    for _ in range(len(_operation)):
        b = _operand.pop()
        a = _operand.pop()
        x = _operation.pop()
        undo(operand, operation, 0, a, b, x)

def get_mx(operand, operation, i):
    if len(operation) <= i:
        fin(operand, operation)
        return

    a, b, x = do(operand, operation, i)
    get_mx(operand, operation, i+1)
    undo(operand, operation, i, a, b, x)
    get_mx(operand, operation, i + 1)

operation, operand = read_data()
get_mx(operand, operation, 0)
print(mx)
  • 괄호 중복 불가
    • 괄호를 함 / 안함
      - do, get_mx, undo / get_mx
    • 괄호를 하고 i+1
      - [1,2,3] / i = 0일 때 i와 i+1을 연산
      - [3,3] / i = 0에서 i+1이므로
      - 결국 2칸 건너뛰게되어 괄호를 할 수 있는 범위
    • 괄호를 안하고 i+1
      - 앞 숫자에 괄호를 하지 않았으므로 i+1부터 괄호 가능

 

다른 사람이 작성한 코드

None
  • 다른 코드들도 비슷하게 구현
  • DP로 풀었다는 코드를 봤는데
    • 오 하고 코드를 보는데 DP가 아닌 것 같았음 (memoization이 되지 않고 값을 모두 계산)
    • 괄호 조건을 만족하지 못했음 (혹시나해서 제출해봤는데 틀림)
    • 그러나 나는 DP로 하겠다는 접근을 못했음
    • 그 분처럼 DP 문제를 많이 풀어보고 접근해보는 자신감이 필요한 듯

 

기억해야할 것

 

 

'코딩테스트' 카테고리의 다른 글

[백준][재귀] 트리의 순회  (0) 2022.06.02
[백준][구현] 아기 상어  (0) 2022.04.29
[백준][구현] 미세먼지 안녕!  (0) 2022.04.29
[백준][구현] 이차원 배열과 연산  (0) 2022.04.29
[백준][구현] 연구소 3  (0) 2022.04.29