https://www.acmicpc.net/problem/2531
๋ฌธ์
ํ์ ์ด๋ฐฅ ์์์ ์๋ ํ์ ํ๋ ๋ฒจํธ ์์ ์ฌ๋ฌ ๊ฐ์ง ์ข ๋ฅ์ ์ด๋ฐฅ์ด ์ ์์ ๋ด๊ฒจ ๋์ฌ ์๊ณ , ์๋์ ์ด ์ค์์ ์๊ธฐ๊ฐ ์ข์ํ๋ ์ด๋ฐฅ์ ๊ณจ๋ผ์ ๋จน๋๋ค. ์ด๋ฐฅ์ ์ข ๋ฅ๋ฅผ ๋ฒํธ๋ก ํํํ ๋, ๋ค์ ๊ทธ๋ฆผ์ ํ์ ์ด๋ฐฅ ์์์ ์ ๋ฒจํธ ์ํ์ ์๋ฅผ ๋ณด์ฌ์ฃผ๊ณ ์๋ค. ๋ฒจํธ ์์๋ ๊ฐ์ ์ข ๋ฅ์ ์ด๋ฐฅ์ด ๋ ์ด์ ์์ ์ ์๋ค.
์๋ก ๋ฌธ์ ์ฐ ํ์ ์ด๋ฐฅ ์์์ ์ด ๋ถ๊ฒฝ๊ธฐ๋ก ์์ ์ด ์ด๋ ค์์, ๋ค์๊ณผ ๊ฐ์ด ๋ ๊ฐ์ง ํ์ฌ๋ฅผ ํตํด์ ๋งค์์ ์ฌ๋ฆฌ๊ณ ์ ํ๋ค.
- ์๋ ํ์ ์ด๋ฐฅ์ ์๋์ด ๋ง์๋๋ก ์ด๋ฐฅ์ ๊ณ ๋ฅด๊ณ , ๋จน์ ์ด๋ฐฅ๋งํผ ์๋๋ฅผ ๊ณ์ฐํ์ง๋ง, ๋ฒจํธ์ ์์์ ํ ์์น๋ถํฐ k๊ฐ์ ์ ์๋ฅผ ์ฐ์ํด์ ๋จน์ ๊ฒฝ์ฐ ํ ์ธ๋ ์ ์ก ๊ฐ๊ฒฉ์ผ๋ก ์ ๊ณตํ๋ค.
- ๊ฐ ๊ณ ๊ฐ์๊ฒ ์ด๋ฐฅ์ ์ข ๋ฅ ํ๋๊ฐ ์ฐ์ธ ์ฟ ํฐ์ ๋ฐํํ๊ณ , 1๋ฒ ํ์ฌ์ ์ฐธ๊ฐํ ๊ฒฝ์ฐ ์ด ์ฟ ํฐ์ ์ ํ์ง ์ข ๋ฅ์ ์ด๋ฐฅ ํ๋๋ฅผ ์ถ๊ฐ๋ก ๋ฌด๋ฃ๋ก ์ ๊ณตํ๋ค. ๋ง์ฝ ์ด ๋ฒํธ์ ์ ํ์ง ์ด๋ฐฅ์ด ํ์ฌ ๋ฒจํธ ์์ ์์ ๊ฒฝ์ฐ, ์๋ฆฌ์ฌ๊ฐ ์๋ก ๋ง๋ค์ด ์๋์๊ฒ ์ ๊ณตํ๋ค.
์ ํ ์ธ ํ์ฌ์ ์ฐธ์ฌํ์ฌ ๊ฐ๋ฅํ ํ ๋ค์ํ ์ข ๋ฅ์ ์ด๋ฐฅ์ ๋จน์ผ๋ ค๊ณ ํ๋ค. ์ ๊ทธ๋ฆผ์ ์๋ฅผ ๊ฐ์ง๊ณ ์๊ฐํด๋ณด์. k=4์ด๊ณ , 30๋ฒ ์ด๋ฐฅ์ ์ฟ ํฐ์ผ๋ก ๋ฐ์๋ค๊ณ ๊ฐ์ ํ์. ์ฟ ํฐ์ ๊ณ ๋ คํ์ง ์์ผ๋ฉด 4๊ฐ์ง ๋ค๋ฅธ ์ด๋ฐฅ์ ๋จน์ ์ ์๋ ๊ฒฝ์ฐ๋ (9, 7, 30, 2), (30, 2, 7, 9), (2, 7, 9, 25) ์ธ ๊ฐ์ง ๊ฒฝ์ฐ๊ฐ ์๋๋ฐ, 30๋ฒ ์ด๋ฐฅ์ ์ถ๊ฐ๋ก ์ฟ ํฐ์ผ๋ก ๋จน์ ์ ์์ผ๋ฏ๋ก (2, 7, 9, 25)๋ฅผ ๊ณ ๋ฅด๋ฉด 5๊ฐ์ง ์ข ๋ฅ์ ์ด๋ฐฅ์ ๋จน์ ์ ์๋ค.
ํ์ ์ด๋ฐฅ ์์์ ์ ๋ฒจํธ ์ํ, ๋ฉ๋ด์ ์๋ ์ด๋ฐฅ์ ๊ฐ์ง์, ์ฐ์ํด์ ๋จน๋ ์ ์์ ๊ฐ์, ์ฟ ํฐ ๋ฒํธ๊ฐ ์ฃผ์ด์ก์ ๋, ์๋์ด ๋จน์ ์ ์๋ ์ด๋ฐฅ ๊ฐ์ง์์ ์ต๋๊ฐ์ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ ๋ ฅ
์ฒซ ๋ฒ์งธ ์ค์๋ ํ์ ์ด๋ฐฅ ๋ฒจํธ์ ๋์ธ ์ ์์ ์ N, ์ด๋ฐฅ์ ๊ฐ์ง์ d, ์ฐ์ํด์ ๋จน๋ ์ ์์ ์ k, ์ฟ ํฐ ๋ฒํธ c๊ฐ ๊ฐ๊ฐ ํ๋์ ๋น ์นธ์ ์ฌ์ด์ ๋๊ณ ์ฃผ์ด์ง๋ค. ๋จ, 2 ≤ N ≤ 30,000, 2 ≤ d ≤ 3,000, 2 ≤ k ≤ 3,000 (k ≤ N), 1 ≤ c ≤ d์ด๋ค. ๋ ๋ฒ์งธ ์ค๋ถํฐ N๊ฐ์ ์ค์๋ ๋ฒจํธ์ ํ ์์น๋ถํฐ ์์ํ์ฌ ํ์ ๋ฐฉํฅ์ ๋ฐ๋ผ๊ฐ ๋ ์ด๋ฐฅ์ ์ข ๋ฅ๋ฅผ ๋ํ๋ด๋ 1 ์ด์ d ์ดํ์ ์ ์๊ฐ ๊ฐ ์ค๋ง๋ค ํ๋์ฉ ์ฃผ์ด์ง๋ค.
์ถ๋ ฅ
์ฃผ์ด์ง ํ์ ์ด๋ฐฅ ๋ฒจํธ์์ ๋จน์ ์ ์๋ ์ด๋ฐฅ์ ๊ฐ์ง์์ ์ต๋๊ฐ์ ํ๋์ ์ ์๋ก ์ถ๋ ฅํ๋ค.
ํ์ด
ํฌ๊ธฐ๊ฐ k์ธ ์ฌ๋ผ์ด๋ฉ ์๋์ฐ๋ฅผ ์ฌ์ฉํ๋ค
// Authored by : seondal
// Co-authored by : -
// #include <bits/stdc++.h>
#include <iostream>
#include <vector>
#include <deque>
using namespace std;
// ์ธ์๋ก ๋ฐ์ eat ํ ๋ด์ ์ด๋ฐฅ์ ์ข
๋ฅ์ ๊ฐฏ์๋ฅผ ์นด์ดํธํด์ ๋ฆฌํด
int countKind(deque<int> q, int k, int d, int c) {
vector<bool> isEat(d+1, false);
isEat[c] = true;
for(int i=0; i<k; i++) {
isEat[q.front()]=true;
q.pop_front();
}
int kind = 0;
for(int i=1; i<=d; i++) {
if(isEat[i])
kind++;
}
return kind;
}
// ๋จน์ ์ ์๋ ์ด๋ฐฅ์ ์ต๋ ๊ฐ์ง์
int maxKind(int n, int d, int k, int c, vector<int>&sushi) {
deque<int> eat;
for(int i=0; i<k; i++)
eat.push_back(sushi[i]);
int max_kind = countKind(eat, k, d, c);
for(int i=k; i<n+k; i++) {
int end = i>=n ? i-n : i; // ์ฌ๋ผ์ด๋ฉ ์๋์ฐ์ ์ถ๊ฐํ ์ธ๋ฑ์ค (sushi ๋ฒกํฐ๋ฅผ ํ์ ํด์ผํ๋ฏ๋ก ์์ธ์ฒ๋ฆฌ)
eat.pop_front();
eat.push_back(sushi[end]);
max_kind = max(max_kind, countKind(eat, k, d, c));
}
return max_kind;
}
int main() {
ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
int n, d, k, c;
cin >> n >> d >> k >> c;
vector<int> sushi(n);
for(int i=0; i<n; i++)
cin >> sushi[i];
cout << maxKind(n, d, k, c, sushi);
return 0;
}
/*
*/
'๐๏ธ ICPC Sinchon > Two Pointer' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[BOJ][C++] ๋ฐฑ์ค 2467๋ฒ: ์ฉ์ก (0) | 2024.08.18 |
---|---|
[BOJ][C++] ๋ฐฑ์ค 2003๋ฒ: ์๋ค์ ํฉ 2 (0) | 2023.07.27 |
๋ฐฑ์ค 10025๋ฒ: ๊ฒ์ผ๋ฅธ ๋ฐฑ๊ณฐ (0) | 2022.10.18 |
๋ฐฑ์ค 1644๋ฒ: ์์์ ์ฐ์ํฉ (0) | 2022.10.18 |
๋ฐฑ์ค 2470๋ฒ: ๋ ์ฉ์ก (0) | 2022.10.18 |