포스트

[ 프로그래머스 ] 징검다리 건너기

문제


https://school.programmers.co.kr/learn/courses/30/lessons/64062

풀이


주어진 징검다리 배열에서 각 원소 값을 1 빼는 것을 반복할 때, 0이 k개 이상 연속되지 않는 최대 횟수를 구하는 문제이다. 단순하게 각 원소 값들을 빼주는 것은 최대 원소 값 200,000,000 이하, 배열의 크기 200,000 이하라는 조건으로 인해 시간 초과가 발생한다. 따라서 이를 해결하기 위해 순차적으로 묶어 탐색한다. 배열의 원소를 순차적으로 k개씩 묶었을 때 각 최댓값은 구간 내 나머지 값들이 모두 0이 되어도 0이 k개 이상 연속되지 않으므로, 이러한 최댓값 중 가장 작은 값이 0이 k개 이상 연속되지 않는 최대 횟수이다. 이를 Deque를 통해 k 이하의 거리를 가진 원소들 중 최댓값을 추가하고 최댓값보다 낮은 숫자를 제거한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#include <string>
#include <vector>
#include <deque>
#include <algorithm>

using namespace std;

int solution(vector<int> stones, int k) 
{
    int answer = 2000000;

    vector<int> ans;

    int idx = 0;
    deque<int> iter;
    deque<int> iter_idx;

    for (int i = 0; i < stones.size(); i++)
    {
        if (iter.size() == 0)
        {
            iter.push_back(stones[i]);
            iter_idx.push_back(i);
        }

        else
        {
            if (i - iter_idx[0] >= k)
            {
                iter.pop_front();
                iter_idx.pop_front();
            }

            int cnt = iter.size();

            for (int j = 0; j < cnt; j++)
            {
                if (iter[iter.size() - 1] < stones[i])
                {
                    iter.pop_back();
                    iter_idx.pop_back();
                }

                else break;
            }

            iter.push_back(stones[i]);
            iter_idx.push_back(i);

        }

        if (i >= k - 1) ans.push_back(iter[0]);
    }

    answer = *min_element(ans.begin(), ans.end());


    return answer;
}


이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.