문제
[ 문제 조건 ]
- 입력
- N : 수의 개수
- A1 ~ An : 수들
- sum(N-1) : 합이 N-1인 4개의 정수, 연산자 4개의 각각 개수가 주어짐 (+,-,×,÷) 순으로
- 출력
- 만들 수 있는 식의 최대 & 최소 값 출력
- -10억 ≤ 결과값 ≤ 10억
[ 해결순서 ]
- 백트래킹 유형은 dfs를 주로 사용하는 것 같아 dfs로 풀어보려고 했다.
- 모든 경우의 수를 전부 구해 최대 최소를 비교하는 문제여서 어쨌든 모두 비교해서 구해야한다.
- 처음 먼저 plus가 1이니까 dfs가 걸려 깊이우선탐색 후 나머지 연산까지 깊이우선탐색 해 값을 갱신
- 깊이우선탐색 plus 연산은 끝났고, 나머지 연산 중 multiply 값이 1이므로 해당 연산 기준으로 재귀적으로 dfs 진행 후
- 최대, 최소 갱신 후 최종 갱신된 값이 정답이 될 것이다.예제 2를 분석해서 구해봤다.

[ 점화식 ]
dfs(depth+1, result+values[depth], plus, minus, multiply, divide)
✏️한줄평
: 생각한 대로 코드 짜기는 어렵다ㅜㅜ
코드
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
n = int(input()) | |
values = list(map(int,input().split())) | |
op = list(map(int,input().split())) | |
max_val = -1e9 | |
min_val = 1e9 | |
def dfs(depth, result, plus, minus, multiply, divide): | |
global max_val, min_val | |
if depth == n: | |
max_val = max(result, max_val) | |
min_val = min(result, min_val) | |
return | |
if plus: | |
dfs(depth+1, result+values[depth], plus-1, minus, multiply, divide) | |
if minus: | |
dfs(depth+1, result-values[depth], plus, minus-1, multiply, divide) | |
if multiply: | |
dfs(depth+1, result*values[depth], plus, minus, multiply-1, divide) | |
if divide: | |
if result < 0: #음수라면 | |
dfs(depth+1, -(-(result)//values[depth]), plus, minus, multiply, divide-1) | |
else: | |
dfs(depth+1, result//values[depth] , plus, minus, multiply, divide-1) | |
dfs(1, values[0], op[0], op[1], op[2], op[3]) | |
print(max_val) | |
print(min_val) |
'알고리즘' 카테고리의 다른 글
[Python] 카카오 2021 BLIND : 신규 아이디 추천 (0) | 2021.09.13 |
---|---|
[Python] 백준 5567번 : 결혼식 (1) | 2021.09.06 |
[Python] 백준 1074번 : Z (0) | 2021.08.30 |
[Python] 백준 11051 : 이항 계수 2 (0) | 2021.08.29 |
[Python] 백준 1309번 : 동물원 (0) | 2021.08.27 |