https://www.acmicpc.net/problem/14888
14888번: 연산자 끼워넣기
첫째 줄에 수의 개수 N(2 ≤ N ≤ 11)가 주어진다. 둘째 줄에는 A1, A2, ..., AN이 주어진다. (1 ≤ Ai ≤ 100) 셋째 줄에는 합이 N-1인 4개의 정수가 주어지는데, 차례대로 덧셈(+)의 개수, 뺄셈(-)의 개수,
www.acmicpc.net
처음에 permu어쩌구를 통해 모든 기호의 배열을 구해서 풀었다.
from itertools import permutations
import sys
input=sys.stdin.readline
n=int(input())
a=[*map(int,input().split())]
q,w,e,r=map(int,input().split())
tmp_sign='+'*q+'-'*w+'*'*e+'/'*r
signs=list(permutations(tmp_sign,n-1))
signs=list(set(signs))
max_answer=-1000000000
min_answer=1000000000
for sign in signs:
answer=a[0]
for i in range(n-1):
if sign[i]=='+':
answer+=a[i+1]
elif sign[i]=='-':
answer-=a[i+1]
elif sign[i]=='*':
answer*=a[i+1]
elif sign[i]=='/':
# answer//=a[i+1]
if answer>=0:
answer//=a[i+1]
else:
answer= -(-answer//a[i+1])
min_answer=min(min_answer,answer)
max_answer=max(max_answer,answer)
print(max_answer,min_answer,sep='\n')
근데 다른 풀이를 보니 그럴거없이
그냥 dfs?로 4경위의 수를 모두 구해서 풀면된다.
만일 주어진 기호를 다 썼다면, 그 기호를 뺀 다른기호만 생각한다.
import sys
input=sys.stdin.readline
def solve(idx,value):
global max_value
global min_value
if idx==n:
max_value=max(max_value,value)
min_value=min(min_value,value)
return
for i in range(4):
if sign[i]==0:
continue
if i==0:
sign[i]-=1
tmp=value+a[idx]
elif i==1:
sign[i]-=1
tmp=value-a[idx]
elif i==2:
sign[i]-=1
tmp=value*a[idx]
else :
sign[i]-=1
if value>0:
tmp=value//a[idx]
else:
tmp=-(-value//a[idx])
solve(idx+1,tmp)
sign[i]+=1
n=int(input())
a=[*map(int,input().split())]
sign=[*map(int,input().split())]
max_value=-1000000000
min_value=1000000000
solve(1,a[0])
print(max_value,min_value,sep='\n')
이러니깐 시간차이가 거의 10배가난다.
다시 돌아오지 않고 계산만 하면 더빠를듯
'boj' 카테고리의 다른 글
| 백준 12865 평범한베낭 (0) | 2022.04.22 |
|---|---|
| 백준 7562 나이트의 이동 (0) | 2022.04.21 |
| 백준 17114 하이퍼 토마토 (0) | 2022.04.20 |
| 백준 7569 토마토2 (0) | 2022.04.20 |
| 백준 2178 미로 탐색 (0) | 2022.04.19 |