이번에 풀어본 문제는
백준 22869번 징검다리 건너기 (small) 입니다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
static int N, K;
static int [] stones;
static boolean [] isVisited;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
K = Integer.parseInt(st.nextToken());
stones = new int[N];
isVisited = new boolean[N];
st = new StringTokenizer(br.readLine());
for (int i = 0; i < N; i++) {
stones[i] = Integer.parseInt(st.nextToken());
}
isVisited[0] = true;
find(0);
System.out.print("NO");
}
static void find(int idx) {
if (isVisited[N - 1]) {
System.out.print("YES");
System.exit(0);
}
for (int i = N - 1; i > idx; i--) {
if (!isVisited[i]) {
int tmp = (i - idx) * (1 + Math.abs(stones[i] - stones[idx]));
if (tmp <= K) {
isVisited[i] = true;
find(i);
}
}
}
}
}
좌측 끝에 위치한 돌이 우측 끝까지 이동할 수 있다면 YES, 아니면 NO를 출력하는 문제입니다.
돌이 이동할 때 필요한 힘을 계산하는 조건이 문제에 주어지며, 입력된 K보다 힘이 크다면 해당 위치로는 이동할 수 없습니다.
문제에 뛰어넘는 거리의 제한은 없으므로, 처음 돌을 시작으로 맨 끝위치부터 재귀를 통해 탐색했습니다. 가장 멀리 뛰어넘을 수 있는 위치를 우선적으로 찾고, 해당 위치로부터 우측 끝까지 도달할 수 있는지 여부를 탐색하면 해결할 수 있습니다.