문제 풀이/프로그래머스
프로그래머스 - 징검다리 건너기 [C++]
JJJaewon
2023. 8. 15. 22:30
반응형
이 문제는 프로그래머스 level 3 문제이다. 처음에는 완전 탐색을 이용해서 풀어보려고 했지만, 당연히 시간 초과가 났다. 징검다리의 횟수가 최대 2억번이기 때문이다.
그래서 그 다음으로는 스택을 사용하는 것처럼 i번째에서 이전 돌들과 비교해서 같거나 큰 징검다리가 나올때까지의 횟수를 세고, 이 값이 k보다 크면 그 높이를 정답으로 내는 방식으로 풀었다. 그러나 이 방식으로는 징검다리가 내림차순으로 되어있는 경우 제대로 된 값이 나올 수 없다.
구글링을 해서 풀이를 보니 이분 탐색으로 문제를 풀 수 있었다. 입력이 큰 것부터 이분 탐색을 생각했어야 했는데 아쉬웠다. 이분 탐색을 생각만 한다면 굉장히 쉽게 풀리는 문제였다.
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
bool possible(vector<int>& stones, int mid, int k) {
int cnt = 0;
for (int i = 0; i < stones.size(); i++) {
if (stones[i] < mid) {
cnt++;
}
else {
cnt = 0;
}
if (cnt >= k) {
return false;
}
}
return true;
}
int solution(vector<int> stones, int k) {
int answer = 0;
int left = 1;
int right = -1;
for (int s : stones) {
right = max(right, s);
}
while (left <= right) {
int mid = (left + right) / 2;
if (!possible(stones, mid, k)) {
right = mid - 1;
}
else {
answer = mid;
left = mid + 1;
}
}
return answer;
}
반응형