https://www.acmicpc.net/problem/15961
๋ด ์ฝ๋
<์ฒซ๋ฒ์งธ ์๋>
#include <iostream>
#include <algorithm>
#include <set>
#include <vector>
using namespace std;
int sushi_belt[3000000];
vector<set<int>> sushi_set;
int main() {
int n, d, k, c;
cin >> n >> d >> k >> c;
for (int i = 0; i < n; i++)
cin >> sushi_belt[i];
/* ์ด๋ฐฅ k๊ฐ์ฉ ๋์ด ์ฝ๊ธฐ */
int index = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < k; j++) {
sushi_set.push_back(set<int>());
int tmp = (i + j > n - 1) ? i + j - n : i + j; // ์ํ ๊ณ ๋ ค
sushi_set[index].insert(sushi_belt[tmp]);
}
sushi_set[index++].insert(c);
}
/* ๊ฐ์ง์ ๊ฐ์ฅ ๋ง์ ๊ฒ ์ฝ๊ธฐ */
int max = 0;
for (int i = 0; i < n; i++) {
sushi_set[i].size() > max ? max = sushi_set[i].size() : max;
}
printf("%d", max);
}
set, vector๋ฅผ ์ด์ฉํด์ ๋จ์ํ๊ฒ ๊ตฌํ
๋ฉ๋ชจ๋ฆฌ์ด๊ณผ
vector<set<int>>
์ด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋๋ฌด ์ก์๋จน๋ ๋ฏํจ => k๊ฐ์ฉ ๋ฐ์์ค๋ ์๊ฐ max๋ฅผ ๊ณ์ฐํ๋ ๊ฒ์ผ๋ก ๋ณ๊ฒฝ
<๋๋ฒ์งธ ์ฝ๋>
#include <iostream>
#include <set>
using namespace std;
int sushi_belt[3000000];
int main() {
int n, d, k, c;
scanf("%d %d %d %d", &n, &d, &k, &c);
for (int i = 0; i < n; i++)
scanf("%d", &sushi_belt[i]);
/* ์ด๋ฐฅ k๊ฐ์ฉ ๋์ด ์ฝ๊ธฐ */
int max = 0;
int skip_num;
int skip = 0;
for (int i = 0; i < n; i++) {
set<int> sushi_set;
skip_num = 0;
skip = 0;
for (int j = 0; j < k; j++) {
if (skip_num >= k + 1 - max) {// ์ค๋ณต๋ ์๊ฐ max ๊ฒฝ์ฐ๋ณด๋ค ๋ง์์ง๋ฉด ๋ฐ๋ก break
// ์ ์ผ ๋ง์ด ๋์ฌ ์ ์๋ ์ข
๋ฅ์ ์ k+1 - ์ด๋๊ป ๋์จ ์ต๋ ์ข
๋ฅ์ ์ max
skip = 1;
break;
}
int tmp = (i + j > n - 1) ? i + j - n : i + j; // ์ํ ๊ณ ๋ ค
int compare_size = sushi_set.size();
sushi_set.insert(sushi_belt[tmp]);
if (sushi_set.size() == compare_size) { // ์ค๋ณต์ผ๋ก ๋ค์ด์ค๋ฉด
skip_num++;
}
}
if (skip)
continue;
sushi_set.insert(c);
if(sushi_set.size() > max)
max = sushi_set.size(); // ๊ฐ์ง ์ ๋ง์ ๊ฑธ๋ก max ์ฑ์ฐ๊ธฐ
}
printf("%d", max);
}
์๊ฐ์ด๊ณผ
์ค๊ฐ์ skip ์ฝ๋๋ฅผ ๋ฃ์๋๋ฐ๋ ์๊ฐ์ด๊ณผ ..
์๊ฐ ๋ณต์ก๋ ์ต๋๋ก ๊ณ์ฐํด๋ณด๋ 9*10^9 ์ด๋ผ ์ํํ๊ธด ํจ! ํ์ง๋ง ์ค์ผ ๋ฐฉ๋ฒ์ ๋ชจ๋ฅด๊ฒ ์
<์ธ๋ฒ์งธ ์ฝ๋>
#include <iostream>
#include <algorithm>
#include <queue>
using namespace std;
int sushi_belt[3000000];
int sushi_kind[3001] = { 0 };
int main() {
int n, d, k, c;
scanf("%d %d %d %d", &n, &d, &k, &c);
for (int i = 0; i < n; i++)
scanf("%d", &sushi_belt[i]);
int index = 0;
int kind = 0;
queue<int> sushi_list;
for (int i = 0; i < k; i++) {
sushi_list.push(sushi_belt[i]);
if (!sushi_kind[sushi_belt[i]]++) {
kind++;
}
}
int max = kind;
/* ์ด๋ฐฅ k๊ฐ์ฉ ๋์ด ์ฝ๊ธฐ */
for (int i = k; i < n+k-1; i++) {
if (!(--sushi_kind[sushi_list.front()])) {
kind--;
}
sushi_list.pop();
if (!sushi_kind[sushi_belt[i % n]]++) {
kind++;
}
sushi_list.push(sushi_belt[i % n]);
if (!sushi_kind[c]) {
if (kind + 1 > max)
max = kind + 1;
}
else {
if (kind > max)
max = kind;
}
}
printf("%d", max);
}
์ ๋ต!
์ฌ๋ผ์ด๋ฉ ์๋์ฐ
๋ฐฉ์์ผ๋ก ๊ตฌํํ์ด์ผ ํ๋ค.
<์ฃผ์>
์ฌ๊ธฐ์ ๋ฌธ์ ์์ ์ ๊ธฐ์ฌ๊ฐ ์๋์ด์๋ ๋ถ๋ถ์ด ์๋๋ฐ ์ด๋ฐฅ์ ์ข ๋ฅ์ธ d๊ฐ 3์ด๋ผ๊ณ ํ๋ฉด ์ด๋ฐฅ์ 1,2,3 ์ด๋ ๊ฒ ๋์จ๋ค(index๊ฐ 1๋ถํฐ ์์). ๊ทธ๋์ sushi_kind๋ผ๋ ๋ฐฐ์ด์ 3001๊ฐ๋ก ๋ง๋ค์ด ์ฃผ์๋ค.
๊ธฐ์กด์๋ queue์ ํ๋์ฉ ๋ฃ๊ณ ๋นผ๋ฉด์ n๋ฒ์ for๋ฌธ ํ ๋ฒ๋ง ๋๋ ๋ฐฉ๋ฒ์ ์๊ฐํด๋ดค๋๋ฐ, ๋ฝ์ k๊ฐ์ ์ด๋ฐฅ์ ์ข ๋ฅ๋ฅผ ๋ณ์๋ก ๋ํ๋ผ ์ ์๋ค๋ ์๊ฐ์ ๋ชปํ๊ณ k๋ฒ์ for๋ฌธ์ ์์์ ๋์์ผ๋๋ค๊ณ ์๊ฐํด ๋ณต์ก๋๊ฐ ๋น์ทํ ๊ฒ์ผ๋ก ์์ํ์ฌ ๊ตฌํํ์ง ์์์๋ค. ํ์ง๋ง kind ๋ณ์๋ฅผ ์ด์ฉํ๋ฉด O(nk)์์ O(n)์ผ๋ก ์๊ฐ๋ณต์ก๋๋ฅผ ์ค์ผ ์ ์๋ค.
=> ๋๋ฌด ์ฝ๊ฒ ํฌ๊ธฐํ๊ณ ๋ต์ ๋ณธ ๊ฒ ๊ฐ์ ๋ฏผ๋งํ๊ตฐ..
<๋ฐฐ์ด ๊ฒ>
- ์ฌ๋ผ์ด๋ฉ ์๋์ฐ ๋ฐฉ์
ํ๋์ฉ ๋นผ๊ณ ๋ฃ๊ณ ํ๋ ์๊ณ ๋ฆฌ์ฆ์์๋ ์ฌ๋ผ์ด๋ฉ ์๋์ฐ ๋ฐฉ์์ ์ฌ์ฉํ๋ ๊ฒ์ด ํธํ๋ค.
- ์ํ์ ๊ตฌํํ๋ ค๋ฉด ๊ทธ๋ฅ ๋ชจ๋๋ฌ ์ฐ์ฐ์ ์ด์ฉํ๋ฉด ๋๋ค.
n๋ณด๋ค ํฐ index์์์ ๊ฒฝ์ฐ๋ ๊ณ ๋ คํ๋ ค๋ฉด index%n์ ํด์ฃผ๋ฉด ์ํ์ผ๋ก ๊ตฌํํ ์ ์๋ค.
- ์ฟ ํฐ์ ์ค c ์ด๋ฐฅ
c ์ด๋ฐฅ์ ๋ง์ง๋ง์ ์ฝ์ ํ๋ฉด ๋ค๋ฅธ ๊ฒฝ์ฐ์ ์๋ฅผ ๊ณ์ฐํ ๋ ๋ค์ ๋นผ์ฃผ์ด์ผํ๋ฏ๋ก ๊ทธ๋ฅ kind ๊ณ์ฐ์๋ง ๊ณ ๋ คํ์๋ค.
'Algorithm ๋ฌธ์ > BOJ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[c++] BOJ 1417๋ฒ :: ๊ตญํ์์ ์ ๊ฑฐ (0) | 2020.04.10 |
---|---|
[c++] BOJ 1038๋ฒ :: ๊ฐ์ํ๋ ์ (0) | 2020.04.05 |
[c++] ๋ฐฑ์ค 18809๋ฒ : Gaaaaaaaaaarden (0) | 2020.03.26 |
[c++] ๋ฐฑ์ค 18808๋ฒ : ์คํฐ์ปค ๋ถ์ด๊ธฐ (0) | 2020.03.21 |
[c++]๋ฐฑ์ค 17836๋ฒ : ๊ณต์ฃผ๋์ ๊ตฌํด๋ผ! (0) | 2020.03.21 |
Comment