티스토리 뷰
https://www.acmicpc.net/problem/15658
문제
N개의 수로 이루어진 수열 A1, A2, ..., AN이 주어진다. 또, 수와 수 사이에 끼워넣을 수 있는 연산자가 주어진다. 연산자는 덧셈(+), 뺄셈(-), 곱셈(×), 나눗셈(÷)으로만 이루어져 있다. 연산자의 개수는 N-1보다 많을 수도 있다. 모든 수의 사이에는 연산자를 한 개 끼워넣어야 하며, 주어진 연산자를 모두 사용하지 않고 모든 수의 사이에 연산자를 끼워넣을 수도 있다.
우리는 수와 수 사이에 연산자를 하나씩 넣어서, 수식을 하나 만들 수 있다. 이때, 주어진 수의 순서를 바꾸면 안 된다.
예를 들어, 6개의 수로 이루어진 수열이 1, 2, 3, 4, 5, 6이고, 주어진 연산자가 덧셈(+) 3개, 뺄셈(-) 2개, 곱셈(×) 1개, 나눗셈(÷) 1개인 경우에는 총 250가지의 식을 만들 수 있다. 예를 들어, 아래와 같은 식을 만들 수 있다.
- 1+2+3-4×5÷6
- 1÷2+3+4-5×6
- 1+2÷3×4-5+6
- 1÷2×3-4+5+6
- 1+2+3+4-5-6
- 1+2+3-4-5×6
식의 계산은 연산자 우선 순위를 무시하고 앞에서부터 진행해야 한다. 또, 나눗셈은 정수 나눗셈으로 몫만 취한다. 음수를 양수로 나눌 때는 C++14의 기준을 따른다. 즉, 양수로 바꾼 뒤 몫을 취하고, 그 몫을 음수로 바꾼 것과 같다. 이에 따라서, 위의 식 4개의 결과를 계산해보면 아래와 같다.
- 1+2+3-4×5÷6 = 1
- 1÷2+3+4-5×6 = 12
- 1+2÷3×4-5+6 = 5
- 1÷2×3-4+5+6 = 7
- 1+2+3+4-5-6 = -1
- 1+2+3-4-5×6 = -18
N개의 수와 연산자가 주어졌을 때, 만들 수 있는 식의 결과가 최대인 것과 최소인 것을 구하는 프로그램을 작성하시오.
코드
import sys
n = int(sys.stdin.readline())
num_arr = list(map(int, sys.stdin.readline().split()))
op_arr = list(map(int, sys.stdin.readline().split()))
max_size, min_size = -sys.maxsize - 1, sys.maxsize
def search(num, index, add, sub, mul, div):
global max_size, min_size
if index == n:
max_size = max(max_size, num)
min_size = min(min_size, num)
return
if add:
search(num + num_arr[index], index + 1, add - 1, sub, mul, div)
if sub:
search(num - num_arr[index], index + 1, add, sub - 1, mul, div)
if mul:
search(num * num_arr[index], index + 1, add, sub, mul - 1, div)
if div:
search(-(-num // num_arr[index]) if num < 0 else num // num_arr[index], index + 1, add, sub, mul, div - 1)
search(num_arr[0], 1 , op_arr[0], op_arr[1], op_arr[2], op_arr[3])
print(max_size)
print(min_size)
풀이
연산자 끼워넣기 문제와 다를 것이 없게 풀었다. add, sub, mul, div가 있으면 모두 탐색하도록 짰었기 때문에 안바꾸고 제출했는데 바로 성공했다. 연산자 끼워넣기 문제는:
https://ohksj77.tistory.com/42
여기에 포스팅 했었다.
'학습 내용 > 백준 문제풀이' 카테고리의 다른 글
백준 16198 파이썬 - 에너지 모으기 (0) | 2022.01.28 |
---|---|
백준 16197 파이썬 - 두 동전 (0) | 2022.01.27 |
백준 14225 파이썬 - 부분수열의 합 (0) | 2022.01.23 |
백준 14888 파이썬 - 연산자 끼워넣기 (0) | 2022.01.22 |
백준 1339 파이썬 - 단어 수학 (0) | 2022.01.22 |