Coding Test/Python

[백준] 14888번: 연산자 끼워넣기(실버 1, 파이썬)

lim.dev 2023. 12. 29. 18:11

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

 

14888번: 연산자 끼워넣기

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

www.acmicpc.net

 

 

아이디어

해당 문제는 dfs를 사용하여 풀었다. 

 

문제를 풀면서 나눗셈을 처리하기 위해 처음에는 //연산자를 사용했지만, 자꾸 답이 다르게 나오는 오류가 있었다.

print(int ( -1 / 3))    # 0
print(-1 // 3)          # -1

오류를 바로잡기 위해서는 위 두 연산의 차이를 알아야했다. 

파이썬의 -1 // 3 연산이 -1을 반환하는 이유는 floor division을 사용하기 때문이었다.

내부적으로 q=floor(a/n)로 동작하기 때문에 -0.XX의 경우 -1을 반환한다.

 

이해를 돕기 위해 참고하기 좋은 글을 가져왔다. 

https://stackoverflow.com/questions/19517868/integer-division-by-negative-number

 

Integer division by negative number

What should integer division -1 / 5 return? I am totally confused by this behaviour. I think mathematically it should be 0, but python and ruby are returning -1. Why are different languages behaving

stackoverflow.com

 

각 연산에 대한 처리를 구현하고 나서, 두 번째 문제를 마주쳤다.

바로 최댓값, 최솟값의 초기화였다.

처음에는 단순히 0으로 선언했지만, 이렇게되면 min(min_value, X) 일 때 X가 양수라면 무조건 0이 반환되기 때문에 문제가 생겼다.

그래서 본문을 다시 살펴보니 아래와 같은 부분이 있었다.

 연산자를 어떻게 끼워넣어도 항상 -10억보다 크거나 같고, 10억보다 작거나 같은 결과가 나오는 입력만 주어진다. 

그래서 max를 -10억, min을 10억으로 초기화해주었다. (1e9는 실수이기 때문에 정수로 바꿔주었다.)

max_value = -int(1e9)
min_value = int(1e9)

 

 

전체 코드

N = int(input())
nums = [ int(x) for x in input().split() ]
add, sub, mul, div = map(int, input().split()) # 덧셈(+)의 개수, 뺄셈(-)의 개수, 곱셈(×)의 개수, 나눗셈(÷)의 개수

max_value = -int(1e9)
min_value = int(1e9)

def dfs(curr, data):
    global add, sub, mul, div, max_value, min_value

    if curr == N:
        max_value = max(max_value, data)
        min_value = min(min_value, data)
        return
    
    if add > 0:
        add -= 1
        dfs(curr + 1, data + nums[curr])
        add += 1
    
    if sub > 0:
        sub -= 1
        dfs(curr + 1, data - nums[curr])
        sub += 1

    if mul > 0:
        mul -= 1
        dfs(curr + 1, data * nums[curr])
        mul += 1

    if div > 0:
        div -= 1
        dfs(curr + 1, int(data / nums[curr]))
        div += 1
    
dfs(1, nums[0])
print(max_value)
print(min_value)