baekjoon

[백준] 11060 점프 점프

윤만석 2023. 4. 17. 15:25

문제

재환이가 1×N 크기의 미로에 갇혀있다. 미로는 1×1 크기의 칸으로 이루어져 있고, 각 칸에는 정수가 하나 쓰여 있다. i번째 칸에 쓰여 있는 수를 Ai라고 했을 때, 재환이는 Ai이하만큼 오른쪽으로 떨어진 칸으로 한 번에 점프할 수 있다. 예를 들어, 3번째 칸에 쓰여 있는 수가 3이면, 재환이는 4, 5, 6번 칸 중 하나로 점프할 수 있다.

재환이는 지금 미로의 가장 왼쪽 끝에 있고, 가장 오른쪽 끝으로 가려고 한다. 이때, 최소 몇 번 점프를 해야 갈 수 있는지 구하는 프로그램을 작성하시오. 만약, 가장 오른쪽 끝으로 갈 수 없는 경우에는 -1을 출력한다.

입력

첫째 줄에 N(1 ≤ N ≤ 1,000)이 주어진다. 둘째 줄에는 Ai (0 ≤ Ai ≤ 100)가 주어진다.

출력

재환이가 최소 몇 번 점프를 해야 가장 오른쪽 끝 칸으로 갈 수 있는지 출력한다. 만약, 가장 오른쪽 끝으로 갈 수 없는 경우에는 -1을 출력한다.

 

#include<bits/stdc++.h>
#define FAST ios_base::sync_with_stdio(false),cin.tie(NULL);
#define mset(v) memset(v,0,sizeof(v));
#define rep(i,a) for(int i=0;i<a;++i)
#define REP(i,a) for(int i=1;i<=a;++i)

using namespace std;

typedef long long ll;
typedef pair<int, int> pi;
typedef tuple<int, int, int>ti;
typedef vector<int> vi;
typedef vector<vector<int>> vvi;
int dy[] = { -1,0,1,0 }, dx[] = { 0,1,0,-1 }, INF = 987654321;

using namespace std;

int N[1001], dp[1001];
int main() {
	FAST;
	int a;
	cin >> a;
	memset(dp, 0x3f, sizeof(dp));
	REP(i, a)
		cin >> N[i];
	dp[a] = 0;
	for (int i = a-1; i >= 1; i--) {
		int temp = INF;
		for (int j = i + 1; j <= i + N[i]; j++) {
			if (j > a)break;
			temp = min(temp, dp[j]);
		}
		dp[i] = temp + 1;
	}
	if (dp[1] >= INF)cout << -1;
	else
		cout << dp[1];
}

도착지점 dp[a]값은 0 입니다.

n부터 1까지 거꾸로가면서, 자신이 움직일수있는 범위내의 dp값중 가장 작은값 + 1 을 해줍니다.

'baekjoon' 카테고리의 다른 글

[백준] 2629 양팔 저울  (0) 2023.04.19
[백준] 10164 격자상의 경로  (0) 2023.04.17
[백준] 14501 퇴사 2  (1) 2023.04.17
[백준] 16194 카드 구매하기 2  (0) 2023.04.17
[백준] 15988 1,2,3 더하기 3  (1) 2023.04.17