알고리즘

백준 22114번 창영이와 점프 (JAVA)

박카스마시며코딩 2023. 5. 20. 19:00

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

 

22114번: 창영이와 점프

창영이는 버스에서 내린 뒤 회사로 걸어가고 있다. 창영이가 걸어가는 길은 대부분 회색 보도블럭으로 포장되어 있는데, 가끔씩 빨간 보도블럭이 놓여있을 때가 있다. 창영이는 어린 시절 빨간

www.acmicpc.net

 

저는 투 포인트를 통해 문제를 해결하였습니다.

endIndex를 늘리면서 만약 k보다 크다면 한번 점프를 사용했는지를 판단하여 사용하지 않았다면 계속 진행합니다.

그 다음으로 k보다 큰 것이 나온다면 이전에 큰 점프를 한 다음 시점으로 startIndex를 옮깁니다.

이때 각각의 지점에서 endIndex - startIndex + 2의 값와 결과값을 비교하여 큰 값으로 합니다.

+2를 하는 이유는 index들이 블록을 가리키는 것이 아닌 블록들의 사이를 가리키고 있기 때문입니다.

즉, startIndex endIndex 사이의 블록들 개수 + startindex이전에 블록 하나 + endIndex이후의 블록의 값이기 때문에 +2를 해주는 것 입니다.

 

package BOJ.etc;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class BOJ_22114 {

    public static void main(String[] args) throws Exception {
        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[] input = new int[n];
        st = new StringTokenizer(br.readLine());
        for(int i = 0 ; i < n-1 ; i++){
            input[i] = Integer.parseInt(st.nextToken());
        }
        int result = cal(input,n,k);
        System.out.println(result);
    }

    private static int cal(int[] input, int n, int k) {
        int result = 1;
        int startIndex = 0;
        int endIndex = -1;
        int prevUsedIndex = 0;
        boolean used = false;
        while(true){
            endIndex++;
            if(endIndex == n-1){
                break;
            }
            if(input[endIndex] <= k){

            }else if(!used){
                used = true;
                prevUsedIndex = endIndex + 1;
            }else{
                startIndex = prevUsedIndex;
                prevUsedIndex = endIndex+1;
            }
            result = Math.max(endIndex  - startIndex +2, result);
        }
        return result;
    }
}