백준 14888 - 파이썬

구기성·2023년 1월 10일
0

알고리즘

목록 보기
16/31
post-custom-banner


연산자 끼워넣기

이 문제는 숫자 사이에 연산자를 끼워넣어서 최대값과 최솟값을 출력하는 문제이다. 즉 모든 경우의 수에 대해서 확인을 해야한다. 그래서 dfs를 통해서 완전 탐색을 하였다. 즉 +, -, *, /에 대해서 모든 경우의 수에 대해서 진행을 했다. 입력으로 숫자의 개수 N이 주어지고, 숫자를 입력하게 한다. 그런 다음 연산의 사용 가능 개수들을 준다. 설명은 주석을 통해서 작성하였다. 내 코드는 아래와 같다.
import sys

def dfs(depth, num, pCount, mCount, tCount, dCount):
    global maxResult, minResult
    if N == depth:  # 깊이가 N이랑 같은 경우
        maxResult = max(maxResult, num)
        minResult = min(minResult, num)
        return

    if pCount:  # 더하기가 남아있는 경우
        dfs(depth + 1, num + array[depth], pCount - 1, mCount, tCount, dCount)
    if mCount:  # 빼기가 남아있는 경우
        dfs(depth + 1, num - array[depth], pCount, mCount - 1, tCount, dCount)
    if tCount:  # 곱하기가 남아있는 경우
        dfs(depth + 1, num * array[depth], pCount, mCount, tCount - 1, dCount)
    if dCount:  # 나누기가 남아있는 경우
        dfs(depth + 1, int(num / array[depth]), pCount, mCount, tCount, dCount - 1)  # -1 // 3인 경우 0이 아닌 -1로 출력돼서 나누기에서 int로 변환


N = int(sys.stdin.readline().strip())
array = list(map(int, sys.stdin.readline().split()))
plusCount, minusCount, multiplyCount, divideCount = map(int, sys.stdin.readline().split())
maxResult = -1000000001
minResult = 1000000001

dfs(1, array[0], plusCount, minusCount, multiplyCount, divideCount)
print(maxResult)
print(minResult)
post-custom-banner

0개의 댓글