[프로그래머스] : 징검다리건너기(c++)
Updated:
[문제] : https://programmers.co.kr/learn/courses/30/lessons/64062
[풀이]
슬라이딩 윈도우와 세그먼트 트리를 활용해 풀었다. k범위의 슬라이딩 윈도우를 적용 하였을 때 범위 내의 모든 디딤돌이 0이 되면 건너 갈 수 없다. 따라서 범위 내의 최대값들 중의 최소값을 찾으면 된다. 이때 구간 내의 최대값을 찾기 위해 반복문을 사용하면 시간초과가 발생하기 때문에 세그먼트 트리를 사용하였다.
[코드]
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
int rangeMax[800000];
int init(const vector<int>& array, int left, int right, int node)
{
if (left == right) return rangeMax[node] = array[left];
int mid = (left + right) / 2;
int leftMax = init(array, left, mid, node * 2);
int rightMax = init(array, mid + 1, right, node * 2 + 1);
return rangeMax[node] = max(leftMax, rightMax);
}
int query(int left, int right, int node, int nodeLeft, int nodeRight)
{
if (right < nodeLeft || left > nodeRight) {
return -1;
}
if (left <= nodeLeft && right >= nodeRight) return rangeMax[node];
int mid = (nodeLeft + nodeRight) / 2;
return max(query(left, right, node * 2, nodeLeft, mid), query(left, right, node * 2 + 1, mid + 1, nodeRight));
}
int solution(vector<int> stones, int k) {
int answer = 210000000;
init(stones,0,stones.size()-1,1);
int left = 0;
int right = k-1;
while(1)
{
if(right >= stones.size()) break;
int k = query(left,right,1,0,stones.size()-1);
answer = min(answer,k);
left++, right++;
}
return answer;
}
댓글남기기