문제
15678번: 연세워터파크
첫 줄에 징검다리의 수 N과 문제에서 설명한 D가 주어진다. (2 ≤ N ≤ 105, 1 ≤ D ≤ N-1) 이어 N개의 정수로, 각 징검다리에 쓰인 수 Ki가 1번 징검다리부터 N번 징검다리까지 순서대로 주어진다. (-109
www.acmicpc.net
풀이
오랜만에 만나 본 단조 큐 문제입니다. 단조 큐가 무엇인지는 이곳에서 다루지 않겠습니다.
좌측에서 우측으로 이동하면서, 구간 내의 최댓값을 유지해야 하는 문제이므로 덱을 사용하였습니다.
먼저 i - D보다 작은 값들은 모두 제거하여 건널 수 없는 징검다리를 제거합니다.
그리고 지속적으로 현재 dp[i]와 다음 징검다리의 번호를 더한 값(K[i])을 비교하여 최댓값을 dp에 저장합니다.
dp[i]보다 작은 값도 모두 제거합니다.
코드 자체는 굉장히 간결합니다.
#include <algorithm>
#include <deque>
#include <iostream>
#include <vector>
using namespace std;
int main() {
int N, D;
cin >> N >> D;
vector<long long> K(N);
for (int i = 0; i < N; i++) {
cin >> K[i];
}
vector<long long> dp = K;
deque<pair<long long, long long>> dq;
for (int i = 0; i < N; i++) {
while (!dq.empty() && dq.front().first < i - D) {
dq.pop_front();
}
if (!dq.empty()) {
dp[i] = max(dp[i], dq.front().second + K[i]);
}
while (!dq.empty() && dq.back().second < dp[i]) {
dq.pop_back();
}
dq.push_back({i, dp[i]});
}
cout << *max_element(dp.begin(), dp.end());
return 0;
}
여담으로, 해당 문제를 풀고 777 문제에 도달하였습니다. Lucky 7!

'📊 알고리즘' 카테고리의 다른 글
[백준] 1920 - 수 찾기 (C++) (0) | 2023.10.04 |
---|---|
[백준] 11003 - 최솟값 찾기 (C++) (0) | 2023.10.04 |
[백준] 2745 - 진법 변환 (Python) (0) | 2023.10.02 |
[백준] 1977 - 완전제곱수 (Python) (0) | 2023.10.02 |
[백준] 2154 - 수 이어 쓰기 3 (Python) (0) | 2023.10.02 |
문제
15678번: 연세워터파크
첫 줄에 징검다리의 수 N과 문제에서 설명한 D가 주어진다. (2 ≤ N ≤ 105, 1 ≤ D ≤ N-1) 이어 N개의 정수로, 각 징검다리에 쓰인 수 Ki가 1번 징검다리부터 N번 징검다리까지 순서대로 주어진다. (-109
www.acmicpc.net
풀이
오랜만에 만나 본 단조 큐 문제입니다. 단조 큐가 무엇인지는 이곳에서 다루지 않겠습니다.
좌측에서 우측으로 이동하면서, 구간 내의 최댓값을 유지해야 하는 문제이므로 덱을 사용하였습니다.
먼저 i - D보다 작은 값들은 모두 제거하여 건널 수 없는 징검다리를 제거합니다.
그리고 지속적으로 현재 dp[i]와 다음 징검다리의 번호를 더한 값(K[i])을 비교하여 최댓값을 dp에 저장합니다.
dp[i]보다 작은 값도 모두 제거합니다.
코드 자체는 굉장히 간결합니다.
#include <algorithm>
#include <deque>
#include <iostream>
#include <vector>
using namespace std;
int main() {
int N, D;
cin >> N >> D;
vector<long long> K(N);
for (int i = 0; i < N; i++) {
cin >> K[i];
}
vector<long long> dp = K;
deque<pair<long long, long long>> dq;
for (int i = 0; i < N; i++) {
while (!dq.empty() && dq.front().first < i - D) {
dq.pop_front();
}
if (!dq.empty()) {
dp[i] = max(dp[i], dq.front().second + K[i]);
}
while (!dq.empty() && dq.back().second < dp[i]) {
dq.pop_back();
}
dq.push_back({i, dp[i]});
}
cout << *max_element(dp.begin(), dp.end());
return 0;
}
여담으로, 해당 문제를 풀고 777 문제에 도달하였습니다. Lucky 7!

'📊 알고리즘' 카테고리의 다른 글
[백준] 1920 - 수 찾기 (C++) (0) | 2023.10.04 |
---|---|
[백준] 11003 - 최솟값 찾기 (C++) (0) | 2023.10.04 |
[백준] 2745 - 진법 변환 (Python) (0) | 2023.10.02 |
[백준] 1977 - 완전제곱수 (Python) (0) | 2023.10.02 |
[백준] 2154 - 수 이어 쓰기 3 (Python) (0) | 2023.10.02 |