algorithm/프로그래머스
[프로그래머스] 징검다리 건너기 (08.19)
자바왕세자
2020. 8. 19. 22:02
문제
https://programmers.co.kr/learn/courses/30/lessons/64062
코딩테스트 연습 - 징검다리 건너기
[2, 4, 5, 3, 2, 1, 4, 2, 5, 1] 3 3
programmers.co.kr
접근법
효율성 문제였기 때문에 이분탐색으로 풀 생각 먼저 했다.
배열의 가장 작은 값과 가장 큰 값을 구하고
그 사이의 값을 이분탐색하면서 답이 될 수 있는 값 중에 가장 큰 값을 찾았다.
코드
class Solution {
public int solution(int[] stones, int k) {
int answer = 0;
int min = getMin(stones);
int max = getMax(stones);
while(min <= max){
int mid = (min+max) / 2;
if(isPossible(stones, mid, k)) {
answer = Math.max(mid, answer);
min = mid+1;
}else{
max = mid-1;
}
}
return answer;
}
private boolean isPossible(int[] stones, int mid, int k) {
int cnt = 0;
for(int stone : stones){
if(stone >= mid){
cnt = 0;
//건널 수 없으면 카운트
}else{
cnt++;
}
//건널 수 없는 돌의 연속된 개수가 k와 같아지면 불가능
if(cnt==k) {
return false;
}
}
return true;
}
private int getMin(int[] stones) {
int min = Integer.MAX_VALUE;
for(int stone : stones)
min = Math.min(stone, min);
return min;
}
private int getMax(int[] stones) {
int max = Integer.MIN_VALUE;
for(int stone : stones)
max = Math.max(stone, max);
return max;
}
}