[프로그래머스] Level3 - 징검다리 건너기

 
by 박신종

> 문제

2019 카카오 겨울 인턴십 문제

문제 : [징검다리 건너기]



> 문제풀이

스톤배열을 활용하여 중복제거오름차순 정렬 한 배열을 만들어주었습니다.

스톤 크기의 차이가 클 수록 효율적인 작업을 수행할 수 있도록 해주었습니다.

작업된 이 배열을 활용하여 이분탐색을 수행하였습니다.

소스는 다음과 같습니다.

import java.util.*;
class Solution {
    static int[] setting(int[] stones) {
		Set<Integer> set = new TreeSet<>();								// 중복제거 및 오름차순 정렬을 위해 TreeSet 사용.
		for(int i=0; i<stones.length; i++) {
			set.add(stones[i]);
		}
		int[] res = new int[set.size()];
		Iterator<Integer> it = set.iterator();
		int index = 0;
		while(it.hasNext()) {
			res[index++] = it.next();
		}
		return res;
	}
	static public int solution(int[] stones, int k) {
		int[] arr = setting(stones);
		int left = 0, right = arr.length-1;
    while(left < right){															// 중복제거 및 정렬된 스톤배열을 활용하여 이분탐색 수행.
      int mid = (left + right)/2;
      if(check(stones, k, arr[mid])){
        left = mid + 1;
      }else {
        right = mid;
      }
    }
    return left>0 ? arr[left-1] : arr[0];							
    }
    
    
    static boolean check(int[] stones, int k, int n){
        int cnt = 0;
        for(int i=0; i<stones.length; i++){
            if(stones[i]-n < 0) cnt++;
            else cnt = 0;
            if(cnt == k) return false;
        }
        return true;
    }
}




문제 출처 : Programmers