문제
https://www.acmicpc.net/problem/14888
첫번째 나의 풀이
import java.util.Scanner;
public class Main {
static int min = Integer.MAX_VALUE;
static int max = Integer.MIN_VALUE;
static int calsNum;
static int[] cals;
static int[] num;
public static void main(String[] args) {
Main T = new Main();
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
sc.nextLine();
calsNum = n - 1;
num = new int[n]; // 숫자
String s1 = sc.nextLine();
String[] string1 = s1.split(" ");
for(int i = 0; i < string1.length; i++){
num[i] = Integer.parseInt(string1[i]);
}
String s2 = sc.nextLine();
String[] strings2 = s2.split(" ");
cals = new int[4]; // 연산자
for(int i = 0; i < 4; i++){
cals[i] = Integer.parseInt(strings2[i]);
}
T.solution();
System.out.println(max);
System.out.println(min);
}
private void solution() {
dfs(0, num[0]);
}
private void dfs(int depth, int sum) {
// 연산자 갯수 모두 사용했다면
if(depth == calsNum){
max = Math.max(max, sum);
min = Math.min(min, sum);
return;
}
// 연산자
for(int i = 0; i < 4; i++){
if(cals[i] == 0){
continue;
}
cals[i] -= 1;
// 사칙연산 결과를 별도로 계산
int nextSum = 0;
if(i == 0){
nextSum = sum + num[depth + 1];
} else if (i == 1) {
nextSum = sum - num[depth + 1];
} else if (i == 2) {
nextSum = sum * num[depth + 1];
} else if (i == 3) {
nextSum = sum / num[depth + 1];
}
dfs(depth + 1, nextSum);
cals[i] += 1;
}
}
}
내가 생각했던 풀이과정
대표 알고리즘: 백트래킹
- 숫자와 연산자를 각각의 배열로 저장한다.
- 연산자는 입력받은 숫자의 - 1개가 필요하기 때문에 연산자 갯수를 calsNum 에 저장해뒀다
- 만약 dfs의 깊이가 필요 연산자 갯수랑 같다면 더이상 연산할 필요가 없기 때문에 얼리 리턴을 해주며 dfs 호출을 반환한다
- 만약 더 연산이 필요하다면 연산자의 반복문 갯수 4개만큼 반복문을 돈다
- 반복문을 돌면서 사용할 수 있는 연산자가 0이라면 반복문을 탈출하고, 그렇지 않다면 사용한 반복문의 연산자 갯수를 -1 감소시킨다
- 기존 재귀함수의 sum결과를 기억해야하기 때문에 sum을 덮어쓰지 않고, 새로운 변수 nextSum에 결과 저장한다.
- sum 값을 변경하면 다른 재귀 호출에 영향을 미치기 때문에, 연산 결과를 nextSum에 저장하여 안전하게 처리합니다.
- dfs호출이 끝났다면 다른 재귀를 위해 사용한 연산자를 되돌려준다(백트래킹)
결과: O
다른 사람의 풀이
.
새로 알게된 점, 확인해야할 점
'알고리즘 > 백준 알고리즘' 카테고리의 다른 글
[Baekjoon] 백준 알고리즘: 2512 - 예산 (0) | 2024.12.06 |
---|---|
[Baekjoon] 백준 알고리즘: 1269 - 대칭 차집합 (0) | 2021.11.23 |
[Baekjoon] 백준 알고리즘: 1181 - 단어정렬 (0) | 2021.11.14 |
[Baekjoon] 백준 알고리즘: 11899 - 괄호 끼워넣기 (0) | 2021.06.19 |
[Baekjoon] 백준 알고리즘: 1302 - 베스트셀러 (2) | 2021.06.14 |
댓글