백준 16198 에너지 모으기 (Java,자바)

jonghyukLee·2022년 9월 5일
0

이번에 풀어본 문제는
백준 16198번 에너지 모으기 입니다.

📕 문제 링크

❗️코드

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

public class Main {
    static int N;
    static int max = Integer.MIN_VALUE;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        N = Integer.parseInt(br.readLine());

        List<Integer> list = new ArrayList<>();
        StringTokenizer st = new StringTokenizer(br.readLine());
        for (int i = 0; i < N; i++) list.add(Integer.parseInt(st.nextToken()));

        charge(list,0);
        System.out.print(max);
    }
    static void charge(List<Integer> list, int sum) {
        if (list.size() == 2) {
            max = Math.max(max, sum);
            return;
        }

        for (int i = 1; i < list.size() - 1; i++) {
            int tmp = list.get(i);
            int chargeValue = list.get(i - 1) * list.get(i + 1);
            list.remove(i);
            charge(list, sum + chargeValue);
            list.add(i, tmp);
        }
    }
}

📝 풀이

N개의 구슬 중 양쪽 끝을 제외하고 하나의 구슬을 선택해 나가며 선택한 구슬의 양옆에서 에너지를 모아, 최댓값을 구하는 문제입니다.
list에 값을 담아두고, dfs로 해당 구슬을 선택했을 경우를 탐색, 이후에는 선택하지 않은 경우를 탐색하여 모든 경우의 수를 고려해줍니다. list의 크기가 2일경우 양쪽 끝만 남기 때문에 max값을 갱신해주고 return 하면 모든 탐색을 마칠 수 있습니다.

📜 후기

요즘 문제가 잘 안풀리네요..ㅠㅠ 얼른 양을 늘려서 감을 찾아야겠습니다!...

profile
머무르지 않기!

0개의 댓글