코딩문제풀이/프로그래머스

[Java] 징검다리*

코딩하는 포메라니안 2022. 6. 27. 14:34

1. 문제

https://programmers.co.kr/learn/courses/30/lessons/43236

 

코딩테스트 연습 - 징검다리

출발지점부터 distance만큼 떨어진 곳에 도착지점이 있습니다. 그리고 그사이에는 바위들이 놓여있습니다. 바위 중 몇 개를 제거하려고 합니다. 예를 들어, 도착지점이 25만큼 떨어져 있고, 바위가

programmers.co.kr

 

 

 

2. 풀이과정

0~distance 범위를 이진탐색을 통해 답을 찾는다.

 

매 loop마다 중간값보다 작으면 합치고, cnt를 센다.

1) cnt가 n개 이상이면, 값을 줄여야 하므로 right = m-1

2) cnt가 n개 이하면, 값을 늘려야 하므로 left = m+1

3) cnt == n이 되는 중간값은 여러 개 있을 수 있다. 그 중 가장 큰 값이 답이므로 left = m+1

 

import java.util.*;

class Solution {
    public int solution(int distance, int[] rocks, int n) {
        int len = rocks.length;
        //다 없애야 될 경우
        if(len==n){
            return distance;
        }
        int s = 0, e = distance;
        Arrays.sort(rocks);
        int arr[] = new int[len+2];
        for(int i=0; i<len; i++){
            arr[i+1]=rocks[i];
        }
        arr[len+1]=distance;
        while(s<=e){
            int m = (s+e)/2;
            int start = 0, cnt = 0;
            for(int i=1; i<len+2; i++){
                if(arr[i]-arr[start]<m){
                    cnt++;
                }
                else{
                    start=i;
                }
            }
            if(cnt>n){e=m-1;}
            else{s=m+1;}//가능한 것 중 가장 큰 수
        }
        
        return e;
    }
}

 

'코딩문제풀이 > 프로그래머스' 카테고리의 다른 글

[Java] 프로그래머스 : 퍼즐 조각 채우기  (0) 2022.08.05
[Java] 여행경로  (0) 2022.06.27
[Python] 매칭 점수  (0) 2021.09.21
[Python] 길 찾기 게임  (0) 2021.09.11
[Python] 무지의 먹방  (0) 2021.09.10