[Programmers] 징검다리 건너기

Date:

[Programmers] 징검다리 건너기

Problem URL : 징검다리 건너기

#include <string>
#include <vector>
#include <algorithm>

using namespace std;

bool bs(int &mid, int &k, vector<int> &v){
    int cnt = 0;
    for(int i = 0; i < v.size(); i++){
        if(v[i] - mid <= 0)
            cnt++;
        else
            cnt = 0;
        if(cnt >= k)
            return false;
    }
    return true;
}

int solution(vector<int> stones, int k) {
    int start = 1;
    int end = 0;
    int answer = 0;
    for(int i = 0; i < stones.size(); i++) {
        if(end < stones[i]) {
            end = stones[i];
        }
    }
    while(start <= end){
        int mid = (start + end) / 2;
        if(bs(mid, k, stones)) { // mid만큼 건너고도 아직 더 건널 수 있을 때
            answer = mid; 
            start = mid + 1;
        }else
            end = mid - 1;
    }

    // answer는 더이상 건널 수 없는 상태 직전까지의 값이 저장되어있다.
    return answer + 1;
}

Comments

M = 배열의 길이, N은 디딤돌 최대값 이라고 할 때
파라메트릭 서치를 이용하면 O(Mlog(N)) 만에 가능하다.

다음은 효율성 테스트에서 시간 초과한 풀이다.
[1]의 시간복잡도가 최악의 경우 O(MN)이어서 효율성을 통과하지 못한다.

#include <string>
#include <vector>
#include <set>
#include <unordered_map>
#include <iostream>

using namespace std;

int solution(vector<int> stones, int k) {
    int answer = 0;
    set<int> s;
    unordered_map<int,vector<int>> um;
    for(int i = 0; i < stones.size(); i++) {
        s.insert(stones[i]);
        um[stones[i]].push_back(i);
    }
    
    set<int> zero;
    zero.clear();
    int val;
    // [1]
    for(auto it = s.begin(); it != s.end(); it++){
        val = *it;
        for(int i = 0; i < um[*it].size(); i++) {
            zero.insert(um[*it][i]);
        }
        int pre = -1;
        int cnt = 0;
        for(auto iter = zero.begin(); iter != zero.end(); iter++) {
            if(*iter == pre + 1) {
                cnt++;
            }else {
                cnt = 1;
            }
            pre = *iter;
            if(cnt == k) return *it;
        }
	}
    return val;
}

댓글