Question
문제 해설
- 징검다리 디딤돌 존재 + 각 디딤돌에는 값이 부여되어있음
- 친구들은 징검다리를 건너서 가야 함
- 징검다리를 건너기 위해 디딤돌을 밟으면 디딤돌의 수가 1씩 줄어듬
- 디딤돌을 밟을 때 가장 가까운 디딤돌로만 뛸 수 있음
- 최대 k개까지 건너뛸 수 있음
- 징검다리를 건너는 친구들의 최대 수는?
Solution
풀이 접근 방법
- 효율성까지 보는 문제이기 때문에 대부분 이진탐색이나 dp 등등....
- 이진탐색할 것 = 징검다리를 건널 수 있는 친구들의 수
- 탐색하는 친구의 수가 건널 수 있음 = true = 중간 값보다 작은 값들로는 모두 건널 수 있음을 의미 => 중간 값보다 큰 인원으로 건널 수 있는지 확인
- 탐색하는 친구의 수가 건널 수 없음 = false = 중간 값보다 큰 수로는 모두 건널 수 없음을 의미 => 중간 값보다 적은 인원으로 건널 수 있는지 확인
정답 코드
class Solution {
public int solution(int[] stones, int k) {
int answer = 0;
int min = 1;
int max = 200000000;
while (min <= max) {
int mid = (min + max) / 2;
if (canAcrossRiver(stones, k, mid)) {
min = mid + 1;
answer = Math.max(answer, mid);
} else {
max = mid - 1;
}
}
return answer;
}
boolean canAcrossRiver(int[] stones, int k, int friends) {
int skip = 0;
for (int stone : stones) {
if (stone - friends < 0)
skip++;
else
skip = 0;
if (skip == k)
return false;
}
return true;
}
}