코딩 테스트
[프로그래머스] 징검다리 건너기 (자바)
한 면만 쓴 종이
2025. 3. 28. 22:44
https://school.programmers.co.kr/learn/courses/30/lessons/64062
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
아래의 조건 때문에 완전탐색은 불가능하다고 판단했다.
- stones 배열의 크기는 1 이상 200,000 이하입니다.
- stones 배열 각 원소들의 값은 1 이상 200,000,000 이하인 자연수입니다.
그럼 DP 나 이분탐색을 사용해야 겠다고 생각했다.
- DP: DP를 적용해도 시간 복잡도 단축이 크지 않을 것 같았다. 최악의 경우 stones의 원소 값만큼 시간복잡도가 깊어질 수 있기 때문에..
- 이분탐색: 위의 이유로 이분탐색을 적용해야 겠다는 삘이 왔다.. 하지만 어떻게 적용해야 할지 감을 못 잡았다. 그래서 다른 분들 풀이를 참고했다.
left와 right를 사람 수의 min과 max로 잡으면 풀이가 가능했다.
class Solution {
static int[] stones;
static int k;
public int solution(int[] stones, int k) {
this.stones = stones;
this.k = k;
int answer = 0;
int min = 1;
int max = 200000000;
while (min <= max) {
int mid = (min + max) / 2;
if (isPossible(mid)) {
min = mid + 1;
answer = Math.max(answer, mid);
} else {
max = mid - 1;
}
}
return answer;
}
boolean isPossible(int friends) {
int skip = 0;
for (int stone : stones) {
if (stone - friends < 0) {
skip++;
}
else {
skip = 0;
}
if (skip == k) {
return false;
}
}
return true;
}
}
left와 right는 거리 또는 위치를 기준으로 잡아야 한다는 생각이 있었던 것 같다..
[느낀점]
이분탐색을 할 때 left, right, mid는 꼭 거리나 위치가 아니어도 된다.
시간복잡도를 올리는 원인이 되는 값을 left, right, mid로 잡는 경우도 고려하자.
(이 문제에서는 사람 수를 left, right, mid로 잡았다.)