https://www.acmicpc.net/problem/14888
DP로 풀 수 있지 않을까 했는데,
백트래킹을 이용하여 DFS로 짤 수 있어야 풀 수 있는 문제였다.
백트래킹은
한정된 조건을 제시한 문제를 풀 때 쓰는 전략이다.
쉽게 설명해서 모든 경우의수를 시도하여 문제의 정답을 찾아나가지 않고(다중 for문)
시간을 단축하기 위해
한정된 조건에서 BFS나 DFS와 함께 구현한다.
백트랭킹의 특성
한정 조건에 부합하지 않는다면 이전 수행으로 돌아와야 하기 때문에 BFS보다는 DFS가 더 편하다.
백트래킹에 대한 더 자세한 설명은 아래 주소에서 보면 된다.
https://veggie-garden.tistory.com/24
# BOJ_14888
# 23.3.5 일 5:38pm 시작 - 못품
# 입력
n = int(input())
nums = list(map(int, input().split()))
operators = list(map(int, input().split())) # + - * //
maximum, minimum = -1e9, 1e9
def dfs(depth, total, plus, minus, multiply, divide):
global maximum, minimum
if depth == n:
maximum = max(total, maximum)
minimum = min(total, minimum)
return
if plus:
dfs(depth + 1, total + nums[depth], plus - 1, minus, multiply, divide)
if minus:
dfs(depth + 1, total - nums[depth], plus, minus - 1, multiply, divide)
if multiply:
dfs(depth + 1, total * nums[depth], plus, minus, multiply - 1, divide)
if divide:
dfs(depth + 1, total // nums[depth], plus, minus, multiply, divide - 1)
dfs(1, nums[0], operators[0], operators[1], operators[2], operators[3])
print(maximum)
print(minimum)
'Computer Science > Algorithm' 카테고리의 다른 글
[백준] 드디어 실버에서 골드로 (0) | 2023.03.03 |
---|---|
[백준] 1043번 거짓말 가능한 파티수 - set 활용 (0) | 2023.03.03 |
[백준] 플로이드 워셜(Floyd-Warshall) 알고리즘 11403번 (0) | 2023.03.03 |
[백준] 11724번 무방향 그래프 DFS BFS - 재귀에러 (0) | 2023.02.28 |
[백준] 18870 - 이분탐색 말고, 딕셔너리 활용해봐 (0) | 2023.02.27 |