백준 14888 연산자 끼워넣기

김민영·2023년 2월 10일
0

알고리즘

목록 보기
121/125

과정

  • 백트래킹
  • 연산자들 순서대로 배열을 만들고, 최대값, 최소값 계산하고 업데이트

  • 비효율적인 코드 같다.
N = int(input())
nums = list(map(int, input().split()))

a, b, c, d = list(map(int, input().split()))
operators = []
operators.extend([0]*a)
operators.extend([1]*b)
operators.extend([2]*c)
operators.extend([3]*d)

max_ans = -1e13
min_ans = 1e13

M = N-1
result = []
visited = [False] * (M)
def OperaterOrder(level):
    if level == M:
        ans = nums[0]
        for i in range(M):
            if result[i] == 0:
                ans += nums[i+1]
            elif result[i] == 1:
                ans -= nums[i+1]
            elif result[i] == 2:
                ans *= nums[i+1]
            elif result[i] == 3:
                if ans < 0:
                    ans = (abs(ans)//nums[i+1]) * (-1)
                else:
                    ans = ans // nums[i+1]
            # print(i, operators[result[i]], nums[i+1], ans)
        global max_ans
        global min_ans
        print(max_ans, min_ans, ans)
        if max_ans < ans:
            max_ans = ans
        if min_ans > ans:
            min_ans = ans
        return

    for i in range(M):
        if not visited[i]:
            visited[i] = True
            result.append(operators[i])
            OperaterOrder(level + 1)

            visited[i] = False
            result.pop()

OperaterOrder(0)
print(max_ans)
print(min_ans)

좋은 풀이 같아요

profile
노션에 1차 정리합니당 - https://cream-efraasia-f3c.notion.site/4fb02c0dc82e48358e67c61b7ce8ab36?v=

0개의 댓글