반응형
문제 링크 : https://www.acmicpc.net/problem/14888
첫번째 예제 입력을 보면,
첫 째 줄에는 수의 개수는 2 ,
둘 째 줄에는 5 6
셋째줄에는 0 0 1 0 이기 때문에 곱셈이 하나 있다는 뜻이다.
그러면 출력의 결과는 최댓값, 최솟값 둘로 진행해야 하는데, 연산자가 하나밖에 없으니 둘다 30이라는 것이다.
—
다행인 점은, 첫번째 줄에 숫자의 크기를 준다는 점,
그리고 숫자들이 섞이지 않고 순서를 지킨다는 점.
최댓값과 최솟값의 값이 정해진 점
How to access?
Maybe brote forcing?
이걸 설마 하나하나 다해보는건 아니겠지 고민하다가
결국 알고리즘 분류 힌트를 봤는데,
브루트포스 알고리즘 이었다… 플러스로 백 트래킹
import sys
input = sys.stdin.readline
N = int(input())
number = list(map(int, input().split()))
cal = list(map(int, input().split()))
max_num = -1e9
min_num = 1e9
def dfs(depth, total, plus, mius, mult, divide):
global max_num
global min_num
if depth == N:
max_num = max(total, max_num)
min_num = min(total, min_num)
return
if plus:
dfs(depth + 1, total + number[depth], plus -1, mius, mult, divide)
if mius:
dfs(depth + 1, total - number[depth], plus , mius - 1, mult, divide)
if mult:
dfs(depth + 1, total * number[depth], plus, mius, mult -1, divide)
if divide:
dfs(depth + 1, int(total / number[depth]), plus, mius, mult, divide - 1)
# 이거 // 하면 안됨, 그 이유 설명해서 적기
dfs(1, number[0], cal[0], cal[1], cal[2], cal[3])
print(max_num)
print(min_num)
신경써야 했던 것은
나눗셈이 정수 나눗셈으로 몫만 취한다는 것이다. 음수를 양수로 나눌 때, C++14의 기준으로, 양수로 바꾼 뒤 몫을 취하고, 그 몫을 음수로 바꾼 것이 같게 해야한다.
그래서 나눗셈을 계산할 때에는
// 가 아닌, int()로 감싸주는 작업이 필요했다.
다른 사람들의 코드를 보니, 백트레킹인 DFS 방식으로가 가장 정석이었던 것 같다.
근데, 순열을 사용하여 BFS로 푸는 방법도 있다고 한다. 그 방법은 시간복잡도가 좋지 않다.
반응형
'공부 > 백준\BeakJoon' 카테고리의 다른 글
백준 2504 - 괄호의 값 python (0) | 2024.07.25 |
---|---|
[BEAKJOON] 백준 2667 - 단지번호붙이기 (0) | 2024.04.21 |
[BEAKJOON] 백준 16194번 : 카드 구매하기 2 - 파이썬 (0) | 2023.08.24 |
[BEAKJOON] 백준 11053번 : 가장 긴 증가하는 부분 수열 - 파이썬 (0) | 2023.08.19 |
[BEAKJOON] 백준 2193번 : 이친수 - 파이썬 (0) | 2023.08.15 |