Algorithm/Baekjoon

[백준] 22114: 창영이와 점프 - JAVA

Baspo8 2024. 7. 1. 18:59

https://www.acmicpc.net/problem/22114

 

풀이

뭔가 문제를 이해하는데 오래걸렸다... 컨디션 난조??

 

아무튼.. n개의 블럭들 사이에 거리가 얼마나 떨어져있는지 n-1개의 숫자가 주어진다.

 

`(블럭) 2 (블럭) 3 (블럭) 1 (블럭) 5 (블럭) 3 (블럭) 5 (블럭)`

 

이렇게 블럭이 위치하고있는것이다.

 

이차원 dp배열을 만들었다. [n][2] 사이즈로 만들어서 [i][0]의 경우 점프를 하지 않은 경우, [i][1]의 경우 점프를 한 경우이다.

 

다음 블럭까지 거리가 k보다 크다면 [i][1]에 [i-1][0]값에 1을 더해주고, [i][0]에는 점프를 하지 않았을 때 해당 블럭부터 시작한다는 의미로 1을 넣어준다.

 

k보다 작다면 이전값에서 1씩 더해준다.

 

값을 더하면서 정답을 같이 갱신하면 된다.

 


 

메모리: 26700KB
시간: 268ms
언어: Java 11

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

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        int n = Integer.parseInt(st.nextToken());
        int k = Integer.parseInt(st.nextToken());

        int[] arr = new int[n + 1];
        st = new StringTokenizer(br.readLine());
        for (int i = 1; i < n; i++) {
            arr[i] = Integer.parseInt(st.nextToken());
        }

        int answer = 0;
        int[][] dp = new int[n][2];
        dp[0][0] = dp[0][1] = 1;
        for (int i = 1; i < n; i++) {
            if (arr[i] > k) {
                dp[i][1] = dp[i - 1][0] + 1;
                dp[i][0] = 1;
            } else {
                dp[i][0] = dp[i - 1][0] + 1;
                dp[i][1] = dp[i - 1][1] + 1;
            }

            answer = Math.max(answer, Math.max(dp[i][0], dp[i][1]));
        }

        System.out.println(answer);
    }

}