반응형
문제조건
연산자를 N-1개 나열하여 숫자를 계산한다. (순열)
핵심개념
- 재귀함수와 check 배열을 사용하여 순열을 만들거나
- 재귀함수와 cnt 배열을 사용한다.
(1) 재귀함수와 check배열 사용하는 방법 (시간초과가 나는데 ㅠㅠ)
# 입력받기
n = int(input())
num = list(map(int, input().split()))
cnt = list(map(int, input().split()))
# 연산자 중에서
cal = [0] * cnt[0] + [1] * cnt[1] + [2] * cnt[2] + [3] * cnt[3]
# n-1 개를 뽑은 순열
a = [0] * (n - 1)
# 연산자 중복 체크용
check = [False] * (len(cal))
# 계산값
ans = []
# n-1개 연산자 순열 뽑는 함수
def go(idx, c, m):
if idx == m:
calculate(a)
return
for i in range(len(c)):
if check[i]:
continue
check[i] = True
a[idx] = c[i]
go(idx+1, c, m)
check[i] = False
# 연산자 순열대로 계산하는 함수
def calculate(a):
result = num[0]
global ans
i = 0
for j in a:
i += 1
if j == 0:
result += num[i]
if j == 1:
result -= num[i]
if j == 2:
result *= num[i]
if j == 3:
result = int(result / num[i])
ans.append(result)
go(0, cal, n - 1)
print(max(ans))
print(min(ans))
(2) 재귀함수와 cnt 배열 사용하는 방법
# 입력받기
n = int(input())
num = list(map(int, input().split()))
cnt = list(map(int, input().split()))
max_ans = -1000000000
min_ans = 1000000000
def go(idx, m, ans):
global max_ans, min_ans
if idx == m:
max_ans = max(max_ans, ans)
min_ans = min(min_ans, ans)
return
if cnt[0] > 0:
cnt[0] -= 1
go(idx+1, m, ans+num[idx])
cnt[0] += 1
if cnt[1] > 0:
cnt[1] -= 1
go(idx+1, m, ans-num[idx])
cnt[1] += 1
if cnt[2] > 0:
cnt[2] -= 1
go(idx+1, m, ans*num[idx])
cnt[2] += 1
if cnt[3] > 0:
cnt[3] -= 1
go(idx+1, m, int(ans/num[idx]))
cnt[3] += 1
go(1, n, num[0])
print(max_ans)
print(min_ans)
반응형
'프로그래밍 > 알고리즘 문제' 카테고리의 다른 글
[BOJ 7576 - 토마토] BFS 알고리즘 (Python) (4) | 2019.10.06 |
---|---|
[BOJ 2667 - 단지번호붙이기] BFS (Python) (4) | 2019.10.03 |
[BOJ-6603 로또] 브루트포스(조합) (python) (4) | 2019.09.29 |
[BOJ 15658] 연산자 끼워넣기(2) - python (4) | 2019.09.24 |
[프로그래머스] kakao 2018 코딩테스트 - 후보키 (python) (4) | 2019.09.04 |
댓글