Algorithm/acmicpc.net

때론 머리를 비우기도 하기 (실버2)

winney916 2022. 2. 13. 15:05
728x90

#15658번 연산자 끼워넣기 (2) https://www.acmicpc.net/problem/15658

 

15658번: 연산자 끼워넣기 (2)

첫째 줄에 수의 개수 N(2 ≤ N ≤ 11)가 주어진다. 둘째 줄에는 A1, A2, ..., AN이 주어진다. (1 ≤ Ai ≤ 100) 셋째 줄에는 합이 N-1보다 크거나 같고, 4N보다 작거나 같은 4개의 정수가 주어지는데, 차례대

www.acmicpc.net

 

자꾸 복잡하게만 생각하는게 내 흠인 것 같다.

 

간결한 코드도 좋지만 조금은 편하게 쉽게 생각할 필요가 있다.

 

N = int(input())
nums = list(map(int, input().split()))
cals = list(map(int, input().split()))  # +, -, *, /

maximum = -10**9
minimum = 10**9

def solve(idx, result):
    global maximum, minimum

    if idx == N:
        maximum = max(maximum, result)
        minimum = min(minimum, result)
        return

    if cals[0] > 0:  # add
        cals[0] -= 1
        solve(idx+1, result+nums[idx])
        cals[0] += 1

    if cals[1] > 0:  # sub
        cals[1] -= 1
        solve(idx+1, result-nums[idx])
        cals[1] += 1

    if cals[2] > 0:  # mulitple
        cals[2] -= 1
        solve(idx+1, result*nums[idx])
        cals[2] += 1

    if cals[3] > 0:  # devide
        cals[3] -= 1
        solve(idx+1, int(result/nums[idx]))
        cals[3] += 1


solve(1, nums[0])

print(maximum)
print(minimum)

재귀 호출을 하고 난 뒤, 리스트의 자료들을 원 상태로 복구시키는 작업을 잊지말자.