-
[프로그래머스] 징검다리 건너기 (자바)코딩 테스트 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로 잡았다.)
'코딩 테스트' 카테고리의 다른 글
[백준] 1806번 부분합 자바(Java) (0) 2025.03.25 [프로그래머스] 이모티콘 할인행사 (0) 2025.03.24 [프로그래머스] 표현 가능한 이진 트리 자바 (0) 2025.03.19 [백준] 우주신과의 교감 1774번 자바 (0) 2025.03.19 [백준] 26093 고양이 목에 리본 달기 (DP) (0) 2024.06.26