문제 풀이
LeetCode 1871. Jump Game VII
khj20006
2026. 5. 28. 07:53
반응형
문제
$0$과 $1$로만 이루어진 문자열 $s$가 주어진다.
문자열의 인덱스 $i$에서 $[i+\texttt{minJump}, i+\texttt{maxJump}]$ 범위 내의 값이 $1$인 인덱스로 점프할 수 있다.
단, 인덱스가 문자열의 경계를 넘어가서는 안 된다.
인덱스 $0$에서 $s.\texttt{length}-1$로 점프할 수 있는지 알아보자.
풀이
거꾸로 생각해보자. 인덱스 $i$로 도달할 수 있을 조건이 무엇일까?
$[i-\texttt{maxJump}, i-\texttt{minJump}]$ 범위에서 도달 가능한 인덱스 $j$가 적어도 하나 있어야 한다.
$\texttt{reach}[i]$를 인덱스 $i$로 도달 가능하면 true, 아니면 false라고 정의하자.
인덱스 $i$를 반복문으로 순회한다면, $[i-\texttt{maxJump}, i-\texttt{minJump}]$ 구간을 슬라이딩 윈도우로 관리할 수 있다.
정확히는, 해당 구간에 $\texttt{reach}$가 true인 인덱스의 개수를 $\textbf{count}$ 변수로 관리한다.
$i$가 증가할 때마다 $\texttt{reach}[i-\texttt{minJump}]$의 값을 $\textbf{count}$ 에 반영한다.
동시에, $\texttt{reach}[i-\texttt{maxJump}-1]$의 값을 $\textbf{count}$ 에서 제외한다.
코드
class Solution {
public boolean canReach(String s, int minJump, int maxJump) {
boolean[] reach = new boolean[s.length()];
reach[0] = true;
int count = 0;
for(int i=minJump;i<s.length();i++) {
if(reach[i-minJump]) count++;
if(i-maxJump-1 >= 0 && reach[i-maxJump-1]) count--;
reach[i] = s.charAt(i) == '0' && count > 0;
}
return reach[s.length()-1];
}
}반응형