티스토리 뷰
# argument를 3개 사용한 경우
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
num = int(input())
num_list = list(map(int, input().split()))
plus, minus, multi, division = map(int, input().split())
max_result = -1000000000
min_result = 1000000000
N = plus+minus+multi+division
check_list = [False]*N
count = 0
index = 0
result_list = []
def permutation(count, index, result):
global max_result, min_result
if count == N:
if result > max_result:
max_result = result
if result < min_result:
min_result = result
return
for i in range(N):
if check_list[i] == True:
continue
check_list[i] = True
if i <= plus - 1:
permutation(count + 1, index + 1, result+num_list[index])
elif i <= plus + minus - 1:
permutation(count + 1, index + 1, result-num_list[index])
elif i <= plus + minus + multi - 1:
permutation(count + 1, index + 1, result*num_list[index])
elif i <= plus + minus + multi + division - 1:
if result < 0:
permutation(count + 1, index + 1, -((-result)//num_list[index]))
else:
permutation(count + 1, index + 1, result//num_list[index])
check_list[i] = False
permutation(0,1, num_list[0])
print(max_result)
print(min_result)
|
cs |
이전의 N과 M 문제처럼 백트랙킹을 이용하여 문제를 해결할 수 있다. 그러나 이 python3로 해당 코드를 제출할 경우 시간 초과에 걸리게 된다. 반면 PyPy3로 코드를 제출하면 통과할 수 있는데 이는 PyPy3의 속도가 python3보다 빠르기 때문이다. (둘이 같은 코드를 내도 무관)
# argument를 6개 사용하는 경우
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
num = int(input())
num_list = list(map(int, input().split()))
plus, minus, multi, division = map(int, input().split())
max_result = -1000000000
min_result = 1000000000
N = plus+minus+multi+division
def permutation(count, plus, minus, multi, division, result):
global max_result, min_result
if count == N:
if result > max_result:
max_result = result
if result < min_result:
min_result = result
return
if plus > 0:
permutation(count + 1, plus-1, minus, multi, division, result+num_list[count+1])
if minus > 0:
permutation(count + 1, plus, minus-1, multi, division, result-num_list[count+1])
if multi > 0:
permutation(count + 1, plus, minus, multi-1, division, result*num_list[count+1])
if division > 0:
if result < 0:
permutation(count + 1, plus, minus, multi, division-1, -((-result)//num_list[count+1]))
else:
permutation(count + 1, plus, minus, multi, division-1, result//num_list[count+1])
permutation(0,plus, minus, multi, division, num_list[0])
print(max_result)
print(min_result)
|
cs |
앞의 코드와는 다르게 해당 코드는 python3로 코드를 제출해도 시간제한에 걸리지 않고 통과한다. 앞의 코드에서는 for문을 돌며 재귀적으로 함수를 호출한 반면 해당 코드는 반복문이 없기 때문이다. 대신 argument의 개수가 늘어났지만 늘어난 argument가 모두 int형으로 메모리에 영향을 주지 않는다. 오히려 tail_recursion처럼 arument의 개수가 늘어날수록 시간 복잡도가 개선되는 모양이다.
'알고리즘 문제 > 백준 - 파이썬' 카테고리의 다른 글
백준 2748번_피보나치 수 2 [python/파이썬] (0) | 2020.07.31 |
---|---|
백준 14889번_스타트와 링크 [python/파이썬] (0) | 2020.07.27 |
백준 15652_N과 M(4) [python/파이썬] (0) | 2020.07.26 |
백준 15651번_N과 M(3) [python/파이썬] (0) | 2020.07.26 |
백준 15650번_N과 M (2) [python/파이썬] (0) | 2020.07.26 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 댓글 모듈
- Browser Router
- 파이썬
- 인사이트
- props를 변경하지 않는 이유
- mkcert
- 리액트 키
- 해쉬 라우터
- localhost https
- 리액트 props
- Redux Thunk
- 리액트 리덕스
- 우아한테크코스
- 브라우저 라우터
- 리액트 리스트 키
- 리덕스 썽크
- 리액트 동작원리
- 우테코
- Hash Router
- 1463
- props를 변경하지 못하는 이유
- 다라쓰
- React key
- contentEditable focus
- 백준
- 프론트엔드
- 리액트 jsx
- 프론트
- Python
- 리액트 리스트 key
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
글 보관함