알고리즘/백준

BOJ) 에너지 모으기

Zin0_0 2020. 7. 2. 16:16
반응형

에너지 모으기

 

16198번: 에너지 모으기

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

www.acmicpc.net

풀이

 

브루트 포스 문제로 모든 경우의 수를 다 구해야 했다.

BFS와 DFS 중 DFS가 더 적절하다고 생각해서 DFS로 문제를 풀었다.

문제 조건에 따라서, 1~n-1 까지 하나의 숫자를 골라 좌 우에 있는 에너지를 곱해서 더해나갔다.

이때, 에너지를 담을 변수는 ArrayList를 선택해서 따로 index값을 복잡하게 조정하지 않게 해주었다.

왜냐하면, ArrayList에는 특정 index에 값(Element)를 넣을 수 있는 메소드가 존재하기 때문이다.

배열로 이를 구현하려면 귀찮아지니까 ArrayList를 썼다.

 

아무튼, 인덱스를 정해서 에너지를 구해서 더해준 다음 해당 인덱스를 제거하고 dfs를 돌리고, 다시 인덱스를 넣어주면서

최종적으로 2개가 남았을 때, 더한 에너지 값 중 최대값을 최신화했다.

크게 어려운 문제는 아니었다고 생각한다.

 

코드

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.StringTokenizer;

public class GatherEnergy_16198 {
    static int answer;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        StringTokenizer st = new StringTokenizer(br.readLine());
        int n = Integer.parseInt(st.nextToken());
        ArrayList<Integer> energyList = new ArrayList<>();
        st = new StringTokenizer(br.readLine());
        for(int i=0; i<n; i++) {
            energyList.add(Integer.parseInt(st.nextToken()));
        }

        solution(n,energyList);

        br.close();
    }

    private static void solution(int n, ArrayList<Integer> energyList) {
        answer =0;
        dfs(n,energyList, 0);
        System.out.println(answer);
    }

    private static void dfs(int n, ArrayList<Integer> energyList, int sum) {
        if(n ==2) {
            answer = Math.max(answer,sum);
            return;
        }

        for(int i=1; i<energyList.size()-1; i++) {
            int mul = energyList.get(i-1)*energyList.get(i+1);
            int energy = energyList.get(i);
            energyList.remove(i);
            dfs(n-1, energyList, sum+mul);
            energyList.add(i,energy);
        }
    }
}
반응형