삐까냥의 파도타기

Q2240. 자두나무 본문

코딩/백준 알고리즘

Q2240. 자두나무

금손형아 2019. 3. 2. 15:08

최대 열매 획득 개수를 저장하며 나아가는 로직입니다.


개인적으로 어려웠습니다.


코드에 주석을 달아놨으니, 참고하세요.


import java.io.BufferedReader;

import java.io.InputStreamReader;

import java.util.StringTokenizer;


public class Q2240 {


static int[][] dp;

public static void main(String[] args) throws Exception {

BufferedReader br =  new BufferedReader(new InputStreamReader(System.in));

StringTokenizer st = new StringTokenizer(br.readLine());

int num = Integer.parseInt(st.nextToken());

int moveNum = Integer.parseInt(st.nextToken());

dp = new int[num+1][moveNum+1];

for (int i = 1; i <= num; i++) {

st = new StringTokenizer(br.readLine());

int treeNum = Integer.parseInt(st.nextToken());

for (int j = 0; j <= moveNum; j++) {

if (treeNum == 1) {

if (j%2 == 0) { //현재 위치한 나무에서 자두가 떨어질 경우(이동 횟수가 짝수인 경우)

if (j == 0) { //이동을 한번도 하지 않았을 경우

dp[i][0] = dp[i-1][0] + 1;

} else { //이동을 한번이라도 한 경우

dp[i][j] = Math.max(dp[i-1][j-1], dp[i-1][j]) + 1;

}

} else { //현재 위치한 나무에서 자두가 떨어지지 않을 경우

if (j == 0) { //이동을 한번도 하지 않았을 경우

dp[i][0] = dp[i-1][0];

} else { //이동을 한번이라도 한 경우

dp[i][j] = Math.max(dp[i-1][j-1], dp[i-1][j]);

}

}

} else {

if (j%2 == 1) { //현재 위치한 나무에서 자두가 떨어질 경우(이동 횟수가 홀수인 경우)

if (j == 0) {

dp[i][0] = dp[i-1][0] + 1;

} else {

dp[i][j] = Math.max(dp[i-1][j-1], dp[i-1][j]) + 1;

}

} else { //현재 위치한 나무에서 자두가 떨어지지 않을 경우

if (j == 0) {

dp[i][0] = dp[i-1][0];

} else {

dp[i][j] = Math.max(dp[i-1][j-1], dp[i-1][j]);

}

}

}

}

}

int maxResult = dp[num][0];

for (int j = 1; j <= moveNum; j++) {

maxResult = Math.max(maxResult, dp[num][j]);

}

System.out.println(maxResult);

}


'코딩 > 백준 알고리즘' 카테고리의 다른 글

Q2631. 줄세우기  (0) 2019.03.02
Q2169. 로봇 조종하기  (0) 2019.03.02
Q2294. 동전 2  (0) 2019.03.01
Q1495. 기타리스트  (0) 2019.02.27
Q2302. 극장 좌석  (0) 2019.02.25