원래 문제 설명은 따로 안 적고 바로 풀이를 기록했지만 ... 간혹가다 문제 이해가 안 간 사람들이 있을 수도 있을 것 같아서 앞으로 추가하려고 한다. 나도 가끔 문제 이해가 안 되는 것들이 있어서 ㅎㅎ 역지사지!
이 문제는 주어진 숫자 리스트에서 연산자를 끼워넣는 문제이다.
예를 들어, 숫자 = [1,2,3,4,5] , 연산자 = [+,-,*,/] 라면
"1+2-3*4/5"와 같은 수식이 나올 것이다.
이 때, 숫자는 순서를 바꿀 수 없지만 연산자는 순서를 바꿀 수 있다.
따라서 위 수식 말고 "1-2+3*4/5" 이렇게 표현할 수도 있고 ..
"1*2/3+4-5" 이렇게 표현할 수도 있다.
다양한 경우의 수가 존재하는데 이 모든 경우의 수에서 연산값이 제일 큰 값과 작은 값을 추려내는 문제이다.
이 때 연산자 우선순위는 무시하며 나누기는 문제 조건을 따른다.
내가 이 문제를 틀린 이유는
if __name__ == '__main__':
high = -int(1e9)
low = int(1e9)
N,lst,op = init()
for case in (perm(op,N-1)): # N!
res = calc(lst,case) # N
high = max(high,res)
low = min(low,res)
print(high)
print(low)
op는 연산자 리스트다.
연산자의 모든 순열을 구해서 연산값을 구한다.
그리고 최대,최소를 업데이트 해준다.
모든 연산자 순열을 다 돌았을 때 최대 최소를 출력한다.
def init():
N = int(input())
lst = list(map(int,input().split()))
op = []
plus,minus,mult,devide = map(int,input().split())
for i in range(plus):
op.append('p')
for i in range(minus):
op.append('mn')
for i in range(mult):
op.append('mp')
for i in range(devide):
op.append('d')
return N,lst,op
N, 숫자 리스트, 연산자 리스트 반환
def calc(nums,op):
origin = nums.copy()
for i in range(len(op)):
if op[i] == 'p':
origin[i+1] = origin[i]+nums[i+1]
if op[i] == 'mn':
origin[i+1] = origin[i]-nums[i+1]
if op[i] == 'mp':
origin[i+1] = origin[i]*nums[i+1]
if op[i] == 'd':
if origin[i] < 0:
origin[i+1] = -((-origin[i])//nums[i+1])
else:
origin[i+1] = origin[i]//nums[i+1]
return origin[-1]
숫자 리스트와 연산자 리스트가 주어졌을 때 연산값을 반환해주는 함수.
숫자 리스트를 깊은 복사 해주지 않으면 연산값이 숫자 리스트에 영향을 준다. 조심.
import sys
from itertools import permutations as perm
input = sys.stdin.readline
def init():
N = int(input())
lst = list(map(int,input().split()))
op = []
plus,minus,mult,devide = map(int,input().split())
for i in range(plus):
op.append('p')
for i in range(minus):
op.append('mn')
for i in range(mult):
op.append('mp')
for i in range(devide):
op.append('d')
return N,lst,op
def calc(nums,op):
origin = nums.copy()
for i in range(len(op)):
if op[i] == 'p':
origin[i+1] = origin[i]+nums[i+1]
if op[i] == 'mn':
origin[i+1] = origin[i]-nums[i+1]
if op[i] == 'mp':
origin[i+1] = origin[i]*nums[i+1]
if op[i] == 'd':
if origin[i] < 0:
origin[i+1] = -((-origin[i])//nums[i+1])
else:
origin[i+1] = origin[i]//nums[i+1]
return origin[-1]
if __name__ == '__main__':
high = -int(1e9)
low = int(1e9)
N,lst,op = init()
for case in (perm(op,N-1)): # N!
res = calc(lst,case) # N
high = max(high,res)
low = min(low,res)
print(high)
print(low)