문제링크
https://www.acmicpc.net/problem/14888

문제 풀이
이 문제는 주어진 숫자와 연산자를 사용하여 가능한 모든 식을 만들고, 그 결과 중에서 가장 큰 값과 가장 작은 값을 찾는 문제입니다. 예를 들어, 숫자가 1, 2, 3이고, 연산자가 +, -, *, /일 때, 이 숫자들 사이에 연산자를 넣어서 여러 가지 경우를 계산하는 것입니다.
코드 설명
- 입력 받기:
- 숫자의 개수, 숫자 리스트, 각 연산자의 개수를 입력받습니다.
- 최대값과 최소값 초기화:
- 최대값은 아주 작은 수로, 최소값은 아주 큰 수로 초기화합니다. 나중에 계산하면서 이 값들을 업데이트할 것입니다.
- DFS 함수:
- dfs라는 함수를 정의합니다. 이 함수는 현재 숫자 위치와 지금까지 계산된 값을 인자로 받습니다.
- 만약 모든 숫자를 다 사용했다면, 현재 계산한 값을 최대값과 최소값과 비교하여 업데이트합니다.
- 연산자 사용:
- 덧셈, 뺄셈, 곱셈, 나눗셈을 각각 시도합니다. 사용할 수 있는 연산자가 남아 있다면 그 연산을 수행하고, 다음 숫자로 넘어가기 위해 dfs를 호출합니다.
- 연산이 끝난 후에는 원래대로 돌아가야 하므로, 연산자 개수를 다시 늘려줍니다.
- 나눗셈 처리:
- 나눗셈은 주의해야 합니다. 음수일 때 어떻게 나눌지를 따로 처리합니다. 이 부분은 다른 언어와의 차이점이니 신경 써야 합니다.
- 결과 출력:
- 모든 조합을 다 계산한 후, 최댓값과 최솟값을 출력합니다.
코드
import sys
input = sys.stdin.readline
# 입력 받기
N = int(input())
lst = list(map(int, input().split()))
operators = list(map(int, input().split()))
# 최댓값과 최솟값 초기화
max_result = -1e9
min_result = 1e9
def dfs(n, current_value):
global max_result, min_result
# 종료 조건: 모든 수를 사용한 경우
if n == N - 1:
max_result = max(max_result, current_value)
min_result = min(min_result, current_value)
return
# 각 연산자를 사용하여 재귀 호출
if operators[0] > 0: # 덧셈
operators[0] -= 1
dfs(n + 1, current_value + lst[n + 1])
operators[0] += 1
if operators[1] > 0: # 뺄셈
operators[1] -= 1
dfs(n + 1, current_value - lst[n + 1])
operators[1] += 1
if operators[2] > 0: # 곱셈
operators[2] -= 1
dfs(n + 1, current_value * lst[n + 1])
operators[2] += 1
if operators[3] > 0: # 나눗셈
operators[3] -= 1
if current_value < 0: # 음수 나눗셈 처리
new_value = -(-current_value // lst[n + 1])
else:
new_value = current_value // lst[n + 1]
dfs(n + 1, new_value)
operators[3] += 1
# DFS 호출
dfs(0, lst[0])
# 결과 출력
print(max_result)
print(min_result)
'알고리즘' 카테고리의 다른 글
[JAVA/자바] 백준 BAEKJOON 2563번 색종이 (0) | 2024.08.20 |
---|---|
[PYTHON/파이썬] 백준 BAEKJOON 2609번 최대공약수와 최소공배수 (0) | 2024.08.19 |
[JAVA/자바] 백준 BAEKJOON 3048번 개미 (0) | 2024.08.18 |
[PYTHON/파이썬] 백준 BAEKJOON 2460번 지능형 기차 2 (0) | 2024.08.16 |
[JAVA/자바] 백준 BAEKJOON 10798번 세로읽기 (0) | 2024.08.15 |
문제링크
https://www.acmicpc.net/problem/14888

문제 풀이
이 문제는 주어진 숫자와 연산자를 사용하여 가능한 모든 식을 만들고, 그 결과 중에서 가장 큰 값과 가장 작은 값을 찾는 문제입니다. 예를 들어, 숫자가 1, 2, 3이고, 연산자가 +, -, *, /일 때, 이 숫자들 사이에 연산자를 넣어서 여러 가지 경우를 계산하는 것입니다.
코드 설명
- 입력 받기:
- 숫자의 개수, 숫자 리스트, 각 연산자의 개수를 입력받습니다.
- 최대값과 최소값 초기화:
- 최대값은 아주 작은 수로, 최소값은 아주 큰 수로 초기화합니다. 나중에 계산하면서 이 값들을 업데이트할 것입니다.
- DFS 함수:
- dfs라는 함수를 정의합니다. 이 함수는 현재 숫자 위치와 지금까지 계산된 값을 인자로 받습니다.
- 만약 모든 숫자를 다 사용했다면, 현재 계산한 값을 최대값과 최소값과 비교하여 업데이트합니다.
- 연산자 사용:
- 덧셈, 뺄셈, 곱셈, 나눗셈을 각각 시도합니다. 사용할 수 있는 연산자가 남아 있다면 그 연산을 수행하고, 다음 숫자로 넘어가기 위해 dfs를 호출합니다.
- 연산이 끝난 후에는 원래대로 돌아가야 하므로, 연산자 개수를 다시 늘려줍니다.
- 나눗셈 처리:
- 나눗셈은 주의해야 합니다. 음수일 때 어떻게 나눌지를 따로 처리합니다. 이 부분은 다른 언어와의 차이점이니 신경 써야 합니다.
- 결과 출력:
- 모든 조합을 다 계산한 후, 최댓값과 최솟값을 출력합니다.
코드
import sys
input = sys.stdin.readline
# 입력 받기
N = int(input())
lst = list(map(int, input().split()))
operators = list(map(int, input().split()))
# 최댓값과 최솟값 초기화
max_result = -1e9
min_result = 1e9
def dfs(n, current_value):
global max_result, min_result
# 종료 조건: 모든 수를 사용한 경우
if n == N - 1:
max_result = max(max_result, current_value)
min_result = min(min_result, current_value)
return
# 각 연산자를 사용하여 재귀 호출
if operators[0] > 0: # 덧셈
operators[0] -= 1
dfs(n + 1, current_value + lst[n + 1])
operators[0] += 1
if operators[1] > 0: # 뺄셈
operators[1] -= 1
dfs(n + 1, current_value - lst[n + 1])
operators[1] += 1
if operators[2] > 0: # 곱셈
operators[2] -= 1
dfs(n + 1, current_value * lst[n + 1])
operators[2] += 1
if operators[3] > 0: # 나눗셈
operators[3] -= 1
if current_value < 0: # 음수 나눗셈 처리
new_value = -(-current_value // lst[n + 1])
else:
new_value = current_value // lst[n + 1]
dfs(n + 1, new_value)
operators[3] += 1
# DFS 호출
dfs(0, lst[0])
# 결과 출력
print(max_result)
print(min_result)
'알고리즘' 카테고리의 다른 글
[JAVA/자바] 백준 BAEKJOON 2563번 색종이 (0) | 2024.08.20 |
---|---|
[PYTHON/파이썬] 백준 BAEKJOON 2609번 최대공약수와 최소공배수 (0) | 2024.08.19 |
[JAVA/자바] 백준 BAEKJOON 3048번 개미 (0) | 2024.08.18 |
[PYTHON/파이썬] 백준 BAEKJOON 2460번 지능형 기차 2 (0) | 2024.08.16 |
[JAVA/자바] 백준 BAEKJOON 10798번 세로읽기 (0) | 2024.08.15 |