https://www.acmicpc.net/problem/14888
14888번: 연산자 끼워넣기
첫째 줄에 수의 개수 N(2 ≤ N ≤ 11)가 주어진다. 둘째 줄에는 A1, A2, ..., AN이 주어진다. (1 ≤ Ai ≤ 100) 셋째 줄에는 합이 N-1인 4개의 정수가 주어지는데, 차례대로 덧셈(+)의 개수, 뺄셈(-)의 개수,
www.acmicpc.net
DP로 풀 수 있지 않을까 했는데,
백트래킹을 이용하여 DFS로 짤 수 있어야 풀 수 있는 문제였다.
백트래킹은
한정된 조건을 제시한 문제를 풀 때 쓰는 전략이다.
쉽게 설명해서 모든 경우의수를 시도하여 문제의 정답을 찾아나가지 않고(다중 for문)
시간을 단축하기 위해
한정된 조건에서 BFS나 DFS와 함께 구현한다.
백트랭킹의 특성
한정 조건에 부합하지 않는다면 이전 수행으로 돌아와야 하기 때문에 BFS보다는 DFS가 더 편하다.
백트래킹에 대한 더 자세한 설명은 아래 주소에서 보면 된다.
https://veggie-garden.tistory.com/24
[Python] 백트래킹 (+ DFS와 차이)
백트래킹이란? 백트래킹이란 현재 상태에서 가능한 모든 경로를 따라 들어가 탐색하다, 원하는 값과 불일치하는 부분이 발생하면 더 이상 탐색을 진행하지 않고 전 단계로 돌아가는, 즉 이름 그
veggie-garden.tistory.com
# 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 |