문제
요약
- 연산자를 끼워넣어서 결과를 도출함
- 첫째 줄에는 수의 개수
- 둘째 줄에는 수열
- 셋째 줄에는 덧셈, 뺄셈, 곱셈, 나눗셈의 개수
- 각 식의 최댓값과 최솟값을 출력함
풀이
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
44
45
46
47
48
|
# 연산자를 끼워넣어서 결과를 도출함
# 첫째 줄에는 수의 개수
# 둘째 줄에는 수열
# 셋째 줄에는 덧셈 뺄셈 곱셈 나눗셈의 개수
# 각 식의 최댓값과 최솟값을 출력함
import sys
def dfs(x, now):
global a, b, c, d, max_value, min_value
if x == num: # 더 이상 연산할 수가 없는 경우
max_value = max(max_value, now)
min_value = min(min_value, now)
else:
# 해당 연산자의 개수를 하나 줄이고
# x의 값을 하나 증가시켜서 다음 숫자를 탐색하게 한 뒤, 연산한 뒤의 값을 넣음
if a > 0:
a = a - 1
dfs(x+1, now + arr[x])
a = a + 1
if b > 0:
b = b - 1
dfs(x+1, now - arr[x])
b = b + 1
if c > 0:
c = c - 1
dfs(x+1, now * arr[x])
c = c + 1
if d > 0:
d = d - 1
dfs(x+1, int(now / arr[x]))
d = d + 1
if __name__ == "__main__":
num = int(sys.stdin.readline()) # 숫자의 개수
arr = list(map(int, sys.stdin.readline().split())) # 수열
a, b, c, d = map(int, sys.stdin.readline().split()) # 덧셈, 뺄셈, 곱하기, 나누기
# 최대, 최소값
max_value = -1000000001
min_value = 1000000001
dfs(1, arr[0]) # 첫번째 인덱스 및 첫번째 수열의 값을 넣어서 재귀 시작
print(max_value)
print(min_value)
|
cs |
후기
문제를 보고 나서, 어쨌든 모든 경우를 탐색해야겠다는 생각이 들었다.
모든 경우를 탐색하려면 재귀호출을 사용해야 하는데,
아직은 처음 봤을때 어떻게 구현해야 할지는 감이 잘 안오는 것 같다.
다른 사람의 풀이를 보고 나면 확실하게 이해가 되는데,
그건 다 똑같으니까 처음 문제를 봤을 때 생각이 나도록 계속 포스팅할 예정임
'코딩테스트 > 문제풀이' 카테고리의 다른 글
[코딩테스트] 백준알고리즘 13458번 '시험 감독' 파이썬 (0) | 2022.02.21 |
---|