코딩문제풀이/Baekjoon
[Java] 백준 16198번 : 에너지 모으기
코딩하는 포메라니안
2023. 3. 3. 20:16
1. 문제
https://www.acmicpc.net/problem/16198
16198번: 에너지 모으기
N개의 에너지 구슬이 일렬로 놓여져 있고, 에너지 구슬을 이용해서 에너지를 모으려고 한다. i번째 에너지 구슬의 무게는 Wi이고, 에너지를 모으는 방법은 다음과 같으며, 반복해서 사용할 수 있
www.acmicpc.net
2. 풀이과정
[방법 1] DFS + 새로운 배열 선언 방식
새로운 배열을 만들어서 DFS를 구현했다. 메모리는 많이 사용하지만, 메서드가 종료될 때 배열을 원상태로 되돌리지 않아도 돼서 빠르다.
마지막에 요소가 2개 남았을 때, 최대값을 업데이트해주고 종료한다.
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
static int result;
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
StringTokenizer st = new StringTokenizer(br.readLine());
int[] arr = new int[N];
for(int i=0; i<N; i++){
arr[i] = Integer.parseInt(st.nextToken());
}
solve(arr, N, 0);
System.out.println(result);
}
public static void solve(int[] arr, int size, int energy){
if(size == 2){
result = Math.max(result, energy);
return;
}
for(int i=1; i<size-1; i++){
int[] newArr = new int[size - 1];
int idx = 0;
for(int j=0; j<i; j++){
newArr[idx++] = arr[j];
}
for(int j=i+1; j<size; j++){
newArr[idx++] = arr[j];
}
solve(newArr, size - 1, energy + (arr[i-1] * arr[i+1]));
}
}
}
결과
[방법 2] DFS + Indexing
각 노드마다 자신의 앞을 가르키는 index와 뒤를 가르키는 index 그리고 자신의 값을 가지도록 한다.
이 방법은 Double LinkedList구조와 유사하다고 할 수 있다.
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
static int result;
static Node[] nodes;
static class Node{
int prevIdx, val, nextIdx;
public Node(int prevIdx, int val, int nextIdx){
this.prevIdx = prevIdx;
this.val = val;
this.nextIdx = nextIdx;
}
}
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
StringTokenizer st = new StringTokenizer(br.readLine());
nodes = new Node[N];
for(int i=0; i<N; i++){
nodes[i] = new Node(i-1, Integer.parseInt(st.nextToken()), i+1);
}
solve(N-2, 0);
System.out.println(result);
}
public static void solve(int size, int energy){
if(size == 0){
result = Math.max(result, energy);
return;
}
int idx = nodes[0].nextIdx;//배열 시작 인덱스값
for(int i=0; i<size; i++){
nodes[nodes[idx].prevIdx].nextIdx = nodes[idx].nextIdx;
nodes[nodes[idx].nextIdx].prevIdx = nodes[idx].prevIdx;
solve(size - 1, energy + nodes[nodes[idx].prevIdx].val * nodes[nodes[idx].nextIdx].val);
nodes[nodes[idx].prevIdx].nextIdx = idx;
nodes[nodes[idx].nextIdx].prevIdx = idx;
idx = nodes[idx].nextIdx;
}
}
}
결과