728x90
해결 전략
이 문제는 가능한 모든 연산자 배치를 시도하여 결과의 최댓값과 최솟값을 찾는 백트래킹(DFS) 문제입니다.
알고리즘 개요
- 입력받기: 수열과 연산자 개수를 입력받습니다.
- 백트래킹 함수 구현:
- 현재까지의 계산 결과, 사용한 연산자 개수, 수열의 인덱스를 인자로 받습니다.
- 모든 연산자 배치를 시도합니다.
- 각 연산자 배치마다 결과를 계산하고, 최댓값과 최솟값을 갱신합니다.
- 나눗셈 구현:
- 나눗셈에서 음수 처리를 문제의 요구사항에 맞게 구현합니다.
- 결과 출력: 최종적으로 구한 최댓값과 최솟값을 출력합니다.
핵심 포인트
- 백트래킹을 통한 완전 탐색: 모든 가능한 연산자 배치를 시도하여 최적해를 찾습니다.
- 나눗셈의 정확한 구현: 파이썬의 나눗셈 연산과 문제의 요구사항의 차이를 이해하고 올바르게 구현합니다.
- 연산자 우선순위 무시: 계산은 입력된 수의 순서대로, 연산자 우선순위를 무시하고 앞에서부터 진행합니다.
- 음수 나눗셈 처리: 음수를 양수로 나눌 때는 절댓값으로 나눈 몫을 음수로 변환합니다.
정답 파이썬 코드
N = int(input())
A = list(map(int, input().split()))
operators = list(map(int, input().split())) # [+, -, *, /]
max_result = -1e9
min_result = 1e9
def calculate(a, b, operator_index):
if operator_index == 0: # 덧셈
return a + b
elif operator_index == 1: # 뺄셈
return a - b
elif operator_index == 2: # 곱셈
return a * b
elif operator_index == 3: # 나눗셈
return divide(a, b)
def divide(a, b):
if a < 0:
return -(-a // b)
else:
return a // b
def dfs(index, current_result):
global max_result, min_result
if index == N:
max_result = max(max_result, current_result)
min_result = min(min_result, current_result)
return
for i in range(4):
if operators[i] > 0:
operators[i] -= 1 # 연산자 사용
next_result = calculate(current_result, A[index], i)
dfs(index + 1, next_result)
operators[i] += 1 # 연산자 복구 (백트래킹)
dfs(1, A[0])
print(max_result)
print(min_result)
설명
- 백트래킹(DFS)을 사용하여 가능한 모든 연산자 배치를 시도합니다.
- 각 단계마다 남은 연산자를 확인하고, 재귀적으로 다음 수와 연산을 수행합니다.
- 나눗셈 연산에서 음수 처리를 정확히 구현하여 문제의 요구사항에 맞게 합니다.
- 최댓값과 최솟값을 전역 변수로 관리하며, 모든 경우의 수를 탐색한 후 결과를 출력합니다.
도움이 되셨다면 공감과 댓글 부탁드립니다.
728x90
'Python > 백준' 카테고리의 다른 글
백준 경사로 [14890] 파이썬(Python) 코드 + 해설 (0) | 2024.10.28 |
---|---|
백준 스타트와 링크 [14889] 파이썬(Python) 코드 + 해설 (0) | 2024.10.27 |
백준 로봇 청소기 [14503] 파이썬(Python) 코드 + 해설 (6) | 2024.10.25 |
백준 연구소 [14502] 파이썬(Python) 코드 + 해설 (1) | 2024.10.24 |
백준 퇴사 [14501] Python 코드 + 해설 (0) | 2024.10.23 |