It's easy, if you try

[백준/boj] 16198: 에너지 모으기 (Java) / DFS / 재귀 / 백트래킹 / 브루트포스 본문

알고리즘/자바(Java)

[백준/boj] 16198: 에너지 모으기 (Java) / DFS / 재귀 / 백트래킹 / 브루트포스

s5he2 2021. 6. 23. 21:05
반응형

문제

 

16198번: 에너지 모으기

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

www.acmicpc.net

풀이

import java.util.*;
import java.io.*;

public class Main {
	static List<Integer> marbles = new ArrayList<Integer>();
	static int power = 0;
	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());

		for(int i=0; i< N; i++) 
			marbles.add(Integer.parseInt(st.nextToken()));
		 
		dfs(N, marbles, 0);
		System.out.println(power);
	}
	
	private static void dfs(int n, List<Integer> marbles, int sum) {
		if(n == 2) { // 첫번째와 마지막 구슬만 남았을 때
			power = Math.max(sum, power); // 최댓값 갱신
			return;
		}
		
		for(int i=1; i< marbles.size() -1; i++) { // 첫번째와 마지막 구슬은 제외한다.
			int s = marbles.get(i-1) * marbles.get(i+1); // 양쪽 구슬을 곱한 값
			int temp = marbles.get(i); marbles.remove(i); // i 구슬을 배열에서 없애고
			dfs(n-1, marbles, sum+s); // 재귀 호출 dfs(구슬 개수 -1, i구슬 제외된 배열, s를 더한 sum값)
			marbles.add(i, temp); // i 구슬을 다시 제자리에 삽입한다.
		}
	}
}
반응형
Comments