알고리즘
1. 문제

7 2
2
1
1
2
2
1
1
6
2. Idea
dp[자두(사람) 위치][시간][이동 횟수]
점화식
dp[1][i][j]=Math.max(dp[1][i-1][j],dp[2][i-1][j-1])+1;
dp[2][i][j]=Math.max(dp[2][i-1][j],dp[1][i-1][j-1]);
dp[1][i][j]=Math.max(dp[1][i-1][j],dp[2][i-1][j-1]);
dp[2][i][j]=Math.max(dp[2][i-1][j],dp[1][i-1][j-1])+1;
3. 풀이

3.1. 변수 선언 및 초기화
T: 시간, W: 이동 횟수
arr[ ]: index에 따른 값==T에 따른 자두가 떨어지는 위치
dp[ ]: [현재 위치][시간][이동 횟수]
private static int T, W;
private static int[] arr;
private static int[][][] dp;
3.2. 입력값 배열에 삽입
arr=new int[T+1];
for(int i=1; i<=T; i++){
arr[i]=Integer.parseInt(sc.nextLine());
}
3.3. dp 배열 선언 및 크기 지정
dp=new int[3][T+1][W+2];
위치에 대한 배열 크기가 3인 이유: 0 제외, 1: 1번 나무, 2: 2번 나무에 위치 ->index를 이용하기 위함
W 크기 == W+2, index 0~W+1인 이유
index 1~W==자두(사람)이 이동한 횟수
index W+1 반복문에서 index(j=1부터 시작),j-1을 고려(W+1 -1 -> W).
3.4. 점화식에 따라 dp 배열 생성
for(int i=1; i<=T; i++){
for(int j=1; j<=W+1; j++){
if(arr[i]==1){
dp[1][i][j]=Math.max(dp[1][i-1][j],dp[2][i-1][j-1])+1;
dp[2][i][j]=Math.max(dp[2][i-1][j],dp[1][i-1][j-1]);
}
else{
if (i == 1 && j == 1) continue;
dp[1][i][j]=Math.max(dp[1][i-1][j],dp[2][i-1][j-1]);
dp[2][i][j]=Math.max(dp[2][i-1][j],dp[1][i-1][j-1])+1;
}
}
}
3.5. 결과 출력
int result=0;
for(int i=1; i<=W+1; i++){
result=Math.max(result, Math.max(dp[1][T][i],dp[2][T][i]));
}
System.out.println(result);
4. 전체코드
import java.util.*;
public class BOJ_2240 {
private static int T, W;
private static int[] arr;
private static int[][][] dp;
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
StringTokenizer st=new StringTokenizer(sc.nextLine());
T=Integer.parseInt(st.nextToken());
W=Integer.parseInt(st.nextToken());
arr=new int[T+1];
for(int i=1; i<=T; i++){
arr[i]=Integer.parseInt(sc.nextLine());
}
dp=new int[3][T+1][W+2];
for(int i=1; i<=T; i++){
for(int j=1; j<=W+1; j++){
if(arr[i]==1){
dp[1][i][j]=Math.max(dp[1][i-1][j],dp[2][i-1][j-1])+1;
dp[2][i][j]=Math.max(dp[2][i-1][j],dp[1][i-1][j-1]);
}
else{
if (i == 1 && j == 1) continue;
dp[1][i][j]=Math.max(dp[1][i-1][j],dp[2][i-1][j-1]);
dp[2][i][j]=Math.max(dp[2][i-1][j],dp[1][i-1][j-1])+1;
}
}
}
int result=0;
for(int i=1; i<=W+1; i++){
result=Math.max(result, Math.max(dp[1][T][i],dp[2][T][i]));
}
System.out.println(result);
}
}