링크: https://www.acmicpc.net/problem/14888
유형: 백트래킹, 브루트 포스(완전탐색)
작성일시: 2022년 10월 28일 오후 7:23
입력
출력
1+2+3-45/6
1/2+3+4-56
⇒ 우리는 순서가 상관이 있음. 연산을 한 후, 최대 최소를 구해야 하기 때문
max()
, min()
을 이용해야 한다.N (입력개수) → int num
A1~An (원소) → nums (피연산자) → list로 구현
split()
+, -, *, / 개수 → int list(연산자)
마찬가지로 split()
필요
번외 ) 실제로 코딩테스트에서 많이 쓰는 리스트화 : list(map(int, input().split()))
입력
list()
이용s = list(input().split())
print(s)
map()
num = list(map(int, input().split()))
print(num)
for문
사용N = 5
list1 = []
for i in range(N):
list1.append(input())
print(list1)
map()을 왜 쓰는가?
하나의 값을 다른 값으로 대응시키는 의미. 지도를 뜻하는 map에서 나온 말이다.
지도에 표시한 정보가 현실세계와 1:1로 대응하듯이, 매핑을 통해 하나의 값을 다른 값으로 1:1 대응시킨다.
출처 : http://wiki.hash.kr/index.php/매핑
(-10억≤n≤10억)
cf.
최댓값 → max_value = -1e9
최솟값 → min_value = 1e9
반복문이 너무 많이 생길 것 같을 때 → 백트래킹 이용
백트래킹 풀이법
DFS!
모든 경우의 수를 고려해야 한다.
/*************재귀 호출을 이용한 DFS 코드*******************/
void DFS(int k){ //k번째 정점에 대해 탐색
visited[k] = true; //방문 체크
for(int i = 1; i <= n; i++){
if(G[k][i] && !visited[i]){ //이웃 정점에 대해 방문하지 않은 노드 탐색
DFS(i); //마지막으로 탐색한 노드부터 다시 탐색
}
}
return; //k정점의 모든 인접 정점을 방문한 경우, 백트랙
}
출처: https://jjudrgn.tistory.com/8 [jjudrgn's note:티스토리]
/*************스택 구조를 이용한 DFS 코드*******************/
void DFS(int k){
stackClass<int> DFS;
DFS.pust(root); // 시작점 push
visited[root] = 1;
while(!DFS.isEmpty() && k != stack.GetTop()){
if(All Adjacent Cities Are Visited){ // 인접 노드를 모두 방문한 경우
stack.pop();
}
else{
//인접 노드 중 하나를 선택
stack.push(New);
visited[New] = 1;
}
}
if(stack.isEmpty()) cout<<"NO";
else cout<<"YES";
}
출처: https://jjudrgn.tistory.com/8 [jjudrgn's note:티스토리]
알고리즘 문제 중 DFS 활용하는 문제를 풀어야할때 아래와 같은 기초 바탕 코드 사용하면 좋음
void dfs() {
if(모든 조건 충족) { //1
결과 계산
} else {
dfs() //2
}
void dfs() {
if(모든 조건 충족) { //1
결과 계산
} else {
arr[] = //2
dfs() //3
arr[]==
}
void dfs() {
if(모든 조건 충족) { //1
결과 계산
} else {
for() {
arr[] = //2
dfs() //3
arr[]==
}
}
출처: https://jjudrgn.tistory.com/8 [jjudrgn's note:티스토리]
내가 한 방법
import sys
# 수의 개수 입력받기
N = int(input())
# 수열 입력받기
nums = list(map(int, input().split()))
# 연산자 개수 입력받기
op = list(map(int, input().split()))
# 최댓값, 최솟값 초기화하기
max_value = -1e9
min_value = 1e9
# dfs 함수 정의
def solution(num, idx, add, sub, mul, div):
global max_value, min_ans
# 연산자를 모두 사용했을 경우, 다 탐색했기 때문에 최대최소 비교
# 종료 조건에 해당
if idx == N:
max_value = max(max_value, num)
min_value = min(min_value, num)
return
# 연산자, 모든 경우 고려
# 더하기
if add > 0:
solution(num + nums[idx], idx + 1, add - 1, sub, mul, div)
# 빼기
if sub > 0:
solution(num - nums[idx], idx + 1, add, sub - 1, mul, div)
# 곱하기
if mul > 0:
solution(num * nums[idx], idx + 1, add, sub , mul -1, div)
# 나누기
if div > 0:
solution(int(num / nums[idx]), idx + 1, add, sub, mul, div -1)
# dfs 함수 호출
solution(nums[0], 1, op[0], op[1], op[2], op[3])
# 최댓값과 최솟값 결과 출력
print(max_value)
print(min_value)
import sys
# 수의 개수 입력받기
n = int(input())
# 수열 입력받기
data = list(map(int, input().split()))
# 연산자 개수 입력받기
add, sub, mul, div = map(int, input().split())
# 최댓값, 최솟값 초기화하기
max_value = -1e9
min_value = 1e9
# dfs 함수 정의
def dfs(i, arr):
global add, sub, mul, div, max_value, min_value
# 연산자를 모두 사용했을 경우, 다 탐색했기 때문에 최대최소 비교
# 종료 조건에 해당
if i == n:
max_value = max(max_value, arr)
min_value = min(min_value, arr)
return
else:
# 연산자, 모든 경우 고려
# 더하기
if add > 0:
add -= 1
dfs(i+1, arr + data[i])
add += 1
# 빼기
if sub > 0:
sub -= 1
dfs(i+1, arr - data[i])
sub += 1
# 곱하기
if mul > 0:
mul -= 1
dfs(i+1, arr * data[i])
mul += 1
# 나누기
if div > 0:
div -= 1
dfs(i+1, int(arr / data[i]))
div += 1
# dfs 함수 호출
dfs(1, data[0])
# 최댓값과 최솟값 결과 출력
print(max_value)
print(min_value)
출처 : https://data-flower.tistory.com/72
# 순열 (Python3 시간초과 / PyPy3는 통과)
import sys
from itertools import permutations
input = sys.stdin.readline
N = int(input())
num = list(map(int, input().split()))
op_num = list(map(int, input().split())) # +, -, *, /
op_list = ['+', '-', '*', '/']
op = []
for k in range(len(op_num)):
for i in range(op_num[k]):
op.append(op_list[k])
maximum = -1e9
minimum = 1e9
def solve():
global maximum, minimum
for case in permutations(op, N - 1):
total = num[0]
for r in range(1, N):
if case[r - 1] == '+':
total += num[r]
elif case[r - 1] == '-':
total -= num[r]
elif case[r - 1] == '*':
total *= num[r]
elif case[r - 1] == '/':
total = int(total / num[r])
if total > maximum:
maximum = total
if total < minimum:
minimum = total
solve()
print(maximum)
print(minimum)
출처 :