Dazzling 개발 노트

[이것이 취업을 위한 코딩테스트다] Ch08. 다이나믹 프로그래밍 - 개미 전사 (Java) 본문

Algorithm

[이것이 취업을 위한 코딩테스트다] Ch08. 다이나믹 프로그래밍 - 개미 전사 (Java)

dj._.dazzling 2023. 7. 20. 16:15

문제

개미 전사가 부족한 식량을 충당하고자 메뚜기 마을의 식량창고를 몰래 공격하려고 한다

메뚜기 마을에는 여러 개의 식량창고가 있는데 일직선으로 이어져 있다.

각 식량창고에는 정해진 수의 식량을 저장하고 있으며 개미 전사는 식량창고를 선택적으로 약탈하여 식량을 빼앗을 예정이다. 

메뚜기 정찰병들은 일직선상에 존재하는 식량창고 중에서 서로 인접한 식량차고가 공격받으면 바로 알아챌 수 있다.

따라서 개미 전사가 정찰병에게 들키지 않고 식량창고를 약탈하기 위해서는 최소한 한 칸 이상 떨어진 식량창고를 약탈해야 한다.

개미 전사는 식량창고가 일직선상일 때 최대한 많은 식량을 얻기를 원한다.

개미 전사를 위해 식량차고 N개에 대한 정보가 주어졌을 때 얻을 수 있는 식량의 최댓값을 구하는 프로그램을 작성

 

(예시입력)

4

1 3 1 5

(예시출력)

8

 

풀이/후기

(바로 앞 까지의 최적의 해)와 (두칸 앞 까지의 최적의 해 + 현재 위치의 해)를 비교해 더 높은 값을 d[]에 저장함

*이미 반복문을 통해 앞 칸(i-3)까지의 최적의 해는 구해졌기 때문에, 구하고자 하는 칸을 볼 때는 한 칸 앞과 두 칸 앞을 고려하면 됨!

코드

package ThisIsCT;

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

public class ch08_03 {
	// Ch.08 다이나믹 프로그래밍 Dynamic Programming DP
	// 개미 전사
	// 유튜브 풀이 영상 : https://www.youtube.com/watch?v=5Lu34WIx2Us

	static int[] d = new int[100 + 1];

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		int N = Integer.parseInt(br.readLine());
		int[] arr = new int[N];
		
		StringTokenizer str = new StringTokenizer(br.readLine(), " ");
		for (int i=0; i<N; i++) {
			arr[i] = Integer.parseInt(str.nextToken());
		}
		
		/*
		 * (바로 앞까지의 최적의 해)와
		 * (두칸 앞까지의 최적의 해 + 현재 위치의 해)를 비교하여 더 높은 값을 d[]에 저장함
		 */
		
		
		//0과 1번째는 항상 아래와 같고, 반복문은 2부터(세번째) 돌려줌
		d[0] = arr[0];
		d[1] = Math.max(arr[1], arr[0]);
		for (int i=2; i<N; i++) {
			d[i] = Math.max(d[i-1], d[i-2] + arr[i]);
		}
		
		System.out.println(d[N-1]);
	}
}

Commit

https://github.com/allrightDJ0108/CodingTestStudy/commit/4cf375d58b476bb8ab3c28208cf4c53fedc8d712

참고

이코테 유튜브 - 다이나믹 프로그래밍 참고

https://www.youtube.com/watch?v=5Lu34WIx2Us