Coding Test/이코테
[이코테] 개미 전사, DP
lsh2613
2023. 7. 11. 11:49
문제 풀이
보통 이런 문제 처럼 처음부터 끝가지 참조하며 현재 참조하고 있는 부분을 포함해야 할지 말아야 할지 결정해서 원하는 조건을 충족하려면 이전 값들을 알아야 한다. 하지만 그 길이가 길면 길 수록 이전 값들을 계속 계산해야 한다. 따라서 성능상 이전 값들의 연산 결과를 저장하여 보관해두면 바로 꺼내 쓸 수 있어 효율적이다.
이 문제도 마찬가지이다.
0과 1번 인덱스에 한해서는 바로 값을 지정해두고 반복문을 통해
max(이전 값, 2번째 전 값+현재 값)을 통해 더 큰 값을 택한다
위 로직을 코드로 작성해보자.
코드
package 이코테.기출분석.DP;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import static java.lang.Math.*;
public class 개미전사 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
int[] storage = Arrays.stream(br.readLine().split(" "))
.mapToInt(Integer::parseInt)
.toArray();
int dp[] = new int[n];
Arrays.fill(dp, 0);
dp[0] = storage[0];
dp[1] = max(storage[0], storage[1]);
for (int i = 2; i < n; i++) {
dp[i] = max(dp[i - 1], dp[i - 2] + storage[i]);
}
System.out.println(dp[n - 1]);
}
}