알고리즘/programmers

[Programmers 코딩테스트 고득점 Kit] 징검다리

꾸준함. 2021. 9. 26. 03:44

문제 링크입니다: https://programmers.co.kr/learn/courses/30/lessons/43236

 

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

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

programmers.co.kr

이분 탐색을 활용하는 문제였습니다.

 

알고리즘은 아래와 같습니다.

1. rocks 벡터를 오름차순 정렬해줍니다.

2. 각 지점 사이의 거리 최솟값은 1, 최댓값은 distance로 설정해준 뒤 이분 탐색을 진행해줍니다.

2.1 mid 값보다 구간이 짧은 돌은 삭제해주고 삭제된 돌들이 n 이하인지 확인해줍니다.

2.2 n 이하라면 최소값을 mid로 설정해 높여주고 n 초과라면 최댓값을 mid로 설정해 낮춰줍니다.

3. 2번 과정을 통해 얻은 구간의 최소 중 최대값을 반환해줍니다.

 

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
int solution(int distance, vector<int> rocks, int n) {
sort(rocks.begin(), rocks.end());
int left = 1, right = distance;
int result = 0;
while (left + 1 < right)
{
int mid = (left + right) / 2;
int removedCnt = 0;
int lastRock = 0;
for (int rock : rocks)
{
if (mid > (rock - lastRock))
{
removedCnt++;
}
else
{
lastRock = rock;
}
}
if (removedCnt <= n)
{
left = mid;
}
else
{
right = mid;
}
}
return left;
}
int main(void)
{
int distance = 25;
vector<int> rocks = { 2, 14, 11, 21, 17 };
int n = 2;
cout << solution(distance, rocks, n) << "\n";
return 0;
}
view raw .cpp hosted with ❤ by GitHub

 

개발환경:Visual Studio 2017

지적, 조언, 질문 환영입니다! 댓글 남겨주세요~

반응형