베오
DCode
베오
전체 방문자
오늘
어제
  • 분류 전체보기 (218)
    • 공지사항 (1)
    • 잡설 (1)
    • Programming (33)
      • [C] (1)
      • [Java] (4)
      • [Python] (2)
      • [Android] (2)
      • [Network] (0)
      • [Operation System] (2)
      • [Spring Boot] (22)
      • [Docker] (0)
    • Algorithm (31)
      • 자료구조 (2)
      • 알고리즘 (Java) (14)
      • 알고리즘 (기초) (15)
    • Coding Test (131)
      • BOJ (131)
      • Algospat (0)
    • 이론적인거 (14)
      • 보안 (5)
      • 오류 해결 (2)
      • 디자인 패턴 (5)
      • 네트워크 (1)
      • 기타 (1)
    • 최신기술 (4)
      • 블록체인 (1)
    • [Project] (1)

블로그 메뉴

  • 🐈‍⬛ GitHub
  • 📫 방명록
  • 🔖 태그

공지사항

인기 글

티스토리

hELLO · Designed By 정상우.
베오

DCode

Coding Test/BOJ

[BOJ/JAVA] 11060번: 점프 점프

2023. 3. 14. 09:03
11060번: 점프 점프
https://www.acmicpc.net/problem/11060

키워드

i번째 칸에 쓰여 있는 수를 AiA_iAi​라고 했을 때, 재환이는 AiA_iAi​이하만큼 오른쪽으로 떨어진 칸으로 한 번에 점프할 수 있다.

가장 오른쪽 끝으로 갈 수 없는 경우에는 -1을 출력


구현

private static int dp(int index, int count)

현재 위치가 index이고, 뛴 횟수가 count일 때 끝까지 갈 때의 최소 점프 횟수 반환하는 메소드

  • 끝에 도달한 경우 (index == N-1)
    • 현재까지 뛴 횟수를 반환한다.
  • 캐시값이 존재하는 경우 (cache[index][count] ≠ -2)
    • 캐시값을 반환한다.
  • 갈 수 있는 경로를 탐색한다.
    • 범위는 [1, A[index]] 이다.
    • 만약 뛰는 거리가 배열 밖을 벗어나면 반복문을 종료한다.

코드

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

public class java_11060 {
    static int N;
    static int A[];

    static int cache[][];

    public static void main(String[] args) throws IOException {
        // A_i 이하 만큼 한번에 점프할 수 있다.

        // 최소 몇 번 점프를 해야하는지 구하기

        // 못구하면 -1

        // 너비우선 탐색

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

        // N 입력받기
        N = Integer.parseInt(br.readLine());

        A = new int[N];
        // A 입력받기
        StringTokenizer st = new StringTokenizer(br.readLine());
        for (int i = 0; i < N; i++) {
            A[i] = Integer.parseInt(st.nextToken());
        }

        // A_0 위치에서 뛰어보기
        int result = solution();

        System.out.println(result);

        br.close();
    }

    // [i] 에서 오른쪽으로 최소 점프해서 갈 수 있는 값
    private static int solution() {
        cache = new int[N][N];

        for (int i = 0; i < N; i++) {
            Arrays.fill(cache[i], -2);
        }

        int result = dp(0, 0);

        if (result >= 987654321) {
            result = -1;
        }

        return result;
    }

    private static int dp(int index, int count) {
        // 끝에 도달한 경우
        if (index == N - 1) {
            return count;
        }

        if (cache[index][count] != -2) {
            return cache[index][count];
        }

        cache[index][count] = 987654321;

        // 갈 수 있는 경우 추가
        // 뛸 수 있는 칸 수 [1,A_i]
        // 배열의 범위를 벗어나는 경우도 체크
        for (int i = 1; i <= A[index] && index + i < N; i++) {
            cache[index][count] = Math.min(cache[index][count], dp(index + i, count + 1));
        }

        return cache[index][count];
    }
}


Uploaded by N2T

'Coding Test > BOJ' 카테고리의 다른 글

[BOJ/JAVA] 17609번: 회문  (0) 2023.03.20
[BOJ/JAVA] 1958번: LCS 3  (0) 2023.03.20
[BOJ/JAVA] 7562번: 나이트의 이동  (0) 2023.03.14
[BOJ/JAVA] 1068번: 트리  (0) 2023.03.14
[BOJ/JAVA] 11403번: 경로 찾기  (0) 2023.03.14
    'Coding Test/BOJ' 카테고리의 다른 글
    • [BOJ/JAVA] 17609번: 회문
    • [BOJ/JAVA] 1958번: LCS 3
    • [BOJ/JAVA] 7562번: 나이트의 이동
    • [BOJ/JAVA] 1068번: 트리
    베오
    베오

    티스토리툴바