알고리즘

백준 16198번 에너지 모으기 (JAVA)

박카스마시며코딩 2022. 7. 26. 22:00

https://www.acmicpc.net/problem/16198

 

16198번: 에너지 모으기

N개의 에너지 구슬이 일렬로 놓여져 있고, 에너지 구슬을 이용해서 에너지를 모으려고 한다. i번째 에너지 구슬의 무게는 Wi이고, 에너지를 모으는 방법은 다음과 같으며, 반복해서 사용할 수 있

www.acmicpc.net

 

저는 dfs를 통해 문제를 해결하였습니다.

dfs를 통해 각각 선택하고 visited로 해당 요소가 지워졌는지를 표시하였습니다.

이전과 다음은 visited아 아닌것이 나올 때까지 증가 감소 시켜 인덱스를 찾았습니다.

 

package BOJ.dfs;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
import java.util.function.Function;

public class BOJ_16198 {

    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        Function<String,Integer> stoi = Integer::parseInt;
        int n = stoi.apply(st.nextToken());
        int[] input = new int[n];
        st = new StringTokenizer(br.readLine());
        for(int i = 0 ; i < n ; i++){
            input[i] = stoi.apply(st.nextToken());
        }
        boolean[] visited = new boolean[n];
        int result = dfs(n-2,input,visited);
        System.out.println(result);
    }

    private static int dfs(int depth, int[] input, boolean[] visited) {
        if(depth == 0){
            return 0;
        }
        int result = 0;
        for(int i = 1 ; i < input.length-1 ; i++){
            if(visited[i]){
               continue;
            }
            visited[i] = true;
            int next = findNext(input,i,visited);
            int prev = findPrev(input,i,visited);
            result = Math.max(result,next * prev + dfs(depth-1,input,visited));
            visited[i] = false;
        }
        return result;
    }

    private static int findPrev(int[] input, int i, boolean[] visited) {
        while(visited[i]){
            i++;
        }
        return input[i];
    }

    private static int findNext(int[] input, int i, boolean[] visited) {
        while(visited[i]){
            i--;
        }
        return input[i];
    }

}