반갑습니다!

[프로그래머스] 징검다리 본문

알고리즘 문제 풀이

[프로그래머스] 징검다리

김덜덜이 2020. 4. 27. 20:21
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr

풀이

이분탐색으로 해결하는 문제이다. 이분탐색을 조금 응용해서 풀어야한다. 이분탐색에서 가장 중요한 것은 탐색의 기준으로 잡는 것이다. 이 문제에서는 mid를 기준으로 해서 돌들을 순차 탐색하고, mid보다 돌들간의 거리가 짧으면 돌을 제거한다. 그렇게 했을 때 제거된 돌의 개수가 n보다 작거나 같으면 mid 값을 증가시키고, n보다 큰 경우에는 mid값을 감소시켜 이분탐색한다.

코드

#include <string>
#include <vector>
#include <algorithm>
using namespace std;

int solution(int distance, vector<int> rocks, int n) {
    int answer = 0;
    // 거리 계산을 위해 distance도 rocks에 포함
    rocks.push_back(distance);
    // 이분 탐색을 위해 정렬
    sort(rocks.begin(), rocks.end());

    int left = 1, right = distance;
    while (left <= right) {
        int mid = (left + right) / 2;

        int diff;
        int last = -1;
        int cnt = 0;
        for (int i = 0; i < rocks.size(); i++) {
            // i번째 바위 전에는 바위가 존재하지 않는 경우
            if (last == -1) diff = rocks[i];
            else diff = rocks[i] - rocks[last];

            // mid보다 작은 경우 제거할 바위의 개수를 증가
            if (diff < mid) cnt++;
            // mid보다 큰 경우 last 값 갱신
            else last = i;
        }

        if (cnt > n) right = mid - 1;
        else {
            left = mid + 1;
            answer = max(answer, mid);
        }
    }
    return answer;
}

'알고리즘 문제 풀이' 카테고리의 다른 글

[백준] 3190 뱀  (0) 2020.04.29
[프로그래머스] 큰 수 만들기  (0) 2020.04.28
[백준] 12100 2048 (Easy)  (0) 2020.04.27
[백준] 13265 색칠하기  (0) 2020.04.26
[백준] 13460 구슬 탈출 2  (0) 2020.04.26