알고리즘
[백준 16198 JAVA] 에너지 모으기
begong
2024. 4. 22. 16:25
반응형
백트래킹 및 재귀함수 문제
공을 뺄 때마다 배열을 새로만드는 방법은 너무 메모리와 시간을 많이 잡아먹는다
굳이 새로운 배열을 만들지 말고 방문처리를 하여, W번째 공을 뺀 효과를 준다.
또한 W+1,W-1번째 공도 방문처리가 되어있다면, W+2,W-2번째를 탐색하는 식으로, 다음 공을 찾으면 된다.
양끝 공은 절대 빠질 수 없기 때문에 배열 overflow가 나지 않는다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
class Main {
static int max = 0;
static int N;
static boolean[] visit;
static int[] arr;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
arr = new int[N];
visit = new boolean[N];
StringTokenizer st = new StringTokenizer(br.readLine());
for (int i = 0; i < N; i++) {
arr[i] = Integer.parseInt(st.nextToken());
}
brut(0, 0);
System.out.println(max);
}
public static void brut(int depth, int sum) {
if (depth == N - 2) {
max = Math.max(max, sum);
}
for (int i = 1; i < N - 1; i++) {
if (visit[i]) {
continue;
}
visit[i] = true;
int idx = 1;
while (visit[i - idx]) {
idx++;
}
int before = arr[i - idx];
idx = 1;
while (visit[i + idx]) {
idx++;
}
int after = arr[i + idx];
int temp = sum + before * after;
brut(depth + 1, temp);
visit[i] = false;
}
}
}
반응형