알고리즘/BOJ

백준 3988번 수 고르기

꾸준함. 2018. 9. 12. 22:30

문제 링크입니다: https://www.acmicpc.net/problem/3988


슬라이딩 윈도우 기법을 이용하여 푸는 문제였습니다.

백준 2905번 홍준이와 울타리(http://jaimemin.tistory.com/832)처럼 monotone queue를 이용하여 푸는 문제였습니다.


#include <iostream>

#include <deque>

#include <algorithm>

using namespace std;

 

const int MAX = 1000000;

const int INF = 987654321;

 

int arr[MAX];

 

int main(void)

{

        ios_base::sync_with_stdio(0);

        cin.tie(0);

        int N, K;

        cin >> N >> K;

 

        for (int i = 0; i < N; i++)

                 cin >> arr[i];

 

        sort(arr, arr + N);

        deque<int> dq; //idx

        int result = INF;

 

        K = N - K;

        //슬라이딩 윈도우

        for (int i = 0, j = 1; i + K <= N; i++)

        {

                 if (!dq.empty() && dq.front() <= i)

                         dq.pop_front();

 

                 //K개씩 확인

                 for ( ; j < i + K; j++)

                 {

                         //arr[j] - arr[j - 1]이 최대여야한다

                         while (!dq.empty() && arr[j] - arr[j - 1] <= arr[dq.back()] - arr[dq.back() - 1])

                                 dq.pop_back();

                         dq.push_back(j);

                 }

 

                 int m = arr[dq.front()] - arr[dq.front() - 1]; //맨 앞 두 개의 차

                 int M = arr[i + K - 1] - arr[i]; //양 끝 차

                 result = min(result, m + M);

        }

        cout << result << "\n";

        return 0;

}


개발환경:Visual Studio 2017


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

반응형

'알고리즘 > BOJ' 카테고리의 다른 글

백준 11773번 ESEJ  (0) 2018.09.14
백준 11772번 POT  (0) 2018.09.14
문제 5430번 AC  (10) 2018.09.12
백준 10866번 덱  (0) 2018.09.12
백준 15386번 Birokracija  (0) 2018.09.11