코딩테스트

백준 14888 연산자 끼워넣기 - python

math_tbro 2022. 2. 5. 02:24

출처 : https://www.acmicpc.net/problem/14888

 

14888번: 연산자 끼워넣기

첫째 줄에 수의 개수 N(2 ≤ N ≤ 11)가 주어진다. 둘째 줄에는 A1, A2, ..., AN이 주어진다. (1 ≤ Ai ≤ 100) 셋째 줄에는 합이 N-1인 4개의 정수가 주어지는데, 차례대로 덧셈(+)의 개수, 뺄셈(-)의 개수, 

www.acmicpc.net

풀이:

n = int(input())
a = list(map(int, input().split()))
ysj = list(map(int, input().split()))

maximum = -1e9
minimum = 1e9

def dfs(depth, tot, plus, minus, multiply, divide):
    global maximum, minimum
    if depth == n:
        maximum = max(tot, maximum)
        minimum = min(tot, minimum)
        return
    
    if plus:
        dfs(depth + 1, tot + a[depth], plus - 1, minus, multiply, divide)
    if minus:
        dfs(depth + 1, tot - a[depth], plus, minus - 1, multiply, divide)
    if multiply:
        dfs(depth + 1, tot * a[depth], plus, minus, multiply - 1, divide)
    if divide:
        dfs(depth + 1, int(tot / a[depth]), plus , minus, multiply, divide - 1)
        
dfs(1, a[0], ysj[0], ysj[1], ysj[2], ysj[3])
print(maximum)
print(minimum)

결론적으로 풀지는 못했는데 접근한 과정에서 풀이까지 설명하려한다.

 

일단 문제는 제시된 숫자는 배열을 바꿀수 없고 주어진 연산자의 개수만큼 자유롭게 연산해야한다. 

 

처음엔 풀이에서 주어진 a를 for 문으로 잡고 시작을 했는데 생각을 좀 더 해보니....

 

DFS를 써야하는거 a가 아니라 연산과정이였다. 

+ 를 선택 했으면 다음 선택지는 + - * / 고 그 다음은 또 4개가 나누어지는 가지치기 형식의 그림을 떠올렸고 

그대로 코드를 짜면 됐다. 

하지만 위 풀이처럼 저렇게 if 문으로 재귀를 돌리는 생각은 하지 못했다.

 

문제를 다시 보면 최대값과 최소값을 초기화 시켜주고 재귀함수에서 숫자의 개수에 도달하면 최대값과 최솟값을 정해준다.

 

그 밑은 연산자가 있으면 그 연산자를 계산해주고 개수를 하나씩 지우면서 계속 반복하면된다. 

 

( 근데 if 문을 저렇게 쓰면 무조건 plus 부터 시작하지 않나요? .. 1 - 2 + 3 ... 이런것도 계산 하는 걸 보면 if 문이 순서 없이 각자 파트에서 돌린다고 유추 했는데... 맞나요?)

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

백준 9663 N-Queen - Python  (0) 2022.02.19
백준 14889 스타트와 링크 - Python  (0) 2022.02.12
백준 15652 N과 M(4) - python  (0) 2022.02.03
백준 15651 N과 M(3) - python  (0) 2022.02.03
15650 N과 M(2)  (0) 2022.02.02