[백준 - 14888] 연산자 끼워 넣기

koyo·2020년 9월 29일
0

백준

목록 보기
7/13
post-thumbnail

문제

문제링크

N개의 수로 이루어진 수열과 쓰일 연산자의 종류가 주어진다. 해당 연산자들의 조합을 활용하여 나올 수 있는 결과값의 최대값과 최소값을 구해라.
단, 음수의 나눗셈은 해당 수를 양수로 바꾼 뒤 몫을 구하고 다시 음수화 한다.

문제 풀이

문제 그대로 풀이하면된다. 순열을 통해 경우의 수에 맞춰 접근하면 쉽게 나온다.

from itertools import permutations

N = int(input())
num_array = list(map(int, input().split()))

yeon = ['+', '-', '*', '/']
yeon_num =  list(map(int, input().split()))

operator = ""
# string으로 들어가야하는 연산자 다넣기
for n, y in zip(yeon_num, yeon):
    operator += y * n

# operator의 순열 구하기
# 최대, 최소 순으로 값 구하기
answer = [-1e10, 1e10]

for op in permutations(operator):
    temp = num_array[0]
    for i in range(N-1):
        if op[i] == '+':
            temp += num_array[i+1]
        elif op[i] == '-':
            temp -= num_array[i+1]
        elif op[i] == '*':
            temp *= num_array[i+1]
        elif op[i] == '/':
            if temp < 0 :
                t = temp
                t *= -1
                t //= num_array[i+1]
                temp = -1 * t
            else :
                temp //= num_array[i+1]

    if temp > answer[0] :
        # 최대값인 경우
        answer[0] = temp
    if temp < answer[1] :
        # 최소값인 경우
        answer[1] = temp

for x in answer:
    print(x)

다른 풀이로는 DFS를 활용하기도 한다.

# DFS를 활용한 풀이
n = int(input())
# 연산을 수행하고자 하는 수 리스트
data = list(map(int, input().split()))
# 더하기, 빼기, 곱하기, 나누기 연산자 개수
add, sub, mul, div = map(int, input().split())

# 최솟값과 최댓값 초기화
min_value = 1e9
max_value = -1e9

# 깊이 우선 탐색(DFS) 매서드
def dfs(i, now):
    global min_value, max_value, add, sub, mul, div
    # 모든 연산자를 다 사용한 경우, 최솟값과 최댓값 업데이트
    if i == n:
        min_value = min(min_value, now)
        max_value = max(max_value, now)
    else :
        # 각 연산자에 대하여 재귀적으로 수행
        if add > 0:
            add -= 1
            dfs(i + 1, now + data[i])
            add += 1
        if sub > 0:
            sub -= 1
            dfs(i + 1, now - data[i])
            sub += 1
        if mul > 0:
            mul -= 1
            dfs(i + 1, now * data[i])
            mul += 1
        if div > 0:
            div -= 1
            dfs(i + 1, int(now / data[i])) # 나눌 때는 나머지를 제거
            div += 1

# DFS 메서드 호출
dfs(1, data[0])

# 최댓값과 최솟값 차례대로 출력
print(max_value)
print(min_value)

해당 문제는 '이것이 코딩 테스트다 - 나동빈 저'를 공부하며 정리한 내용입니다.

profile
클라우드 개발자가 될 코요입니다.

0개의 댓글