Algorithem/백준 PS with code
백준 #14888 - 연산자 끼워넣기 : 재귀
jamong5
2023. 5. 17. 09:12
(python3)
여러 풀이법이 있겠지만, 매 트라이얼에 같은 행위를 반복하고, 이전 행위들이 다음 행위에 영향을 주기 때문에 재귀로 해결했습니다.
4가지 연산자를 함수화하고 함수를 배열에 담아 접근하여 연산자별 사용 횟수 카운팅 처리와 연산 구현을 같은 인덱스로 처리할 수 있게 하여 좀 더 원활히 코드를 작성할 수 있도록 했습니다.
재귀를 사용할 때는 하나의 층에서 변하면 안되지만, 다음 층으로는 변화시켜 넘겨야할 변수들은 새롭게 할당하여 처리하고, 자료구조의 경우 copy 메서드를적절히 사용해주어야 의도치 않은 에러를 피할 수 있습니다.
구현 코드
# https://www.acmicpc.net/source/60887220
# 23.05.17 8:51 AM!
def solution(input) :
def plus(a,b) :
return a+b
def minus(a,b) :
return a-b
def multi(a,b) :
return a*b
def divi(a,b) :
if a<0 :
return -((-a)//b)
else :
return a//b
oper = [plus, minus, multi, divi]
N = int(input())
num = list(map(int,input().split()))
oper_max_cnt = list(map(int, input().split()))
global cal_f
cal_f = []
def recur(i, cal, cnt) : # i : 현재 연산해야하는 인덱스 번호 (0~N-1)
global cal_f
if i >= N :
cal_f.append(cal)
return
for o in range(4) :
ncnt = cnt.copy()
if ncnt[o] < oper_max_cnt[o] :
ncnt[o]+=1
ncal = oper[o](cal, num[i])
recur(i+1, ncal, ncnt)
recur(1,num[0],[0,0,0,0])
print(max(cal_f))
print(min(cal_f))
solution(input)