: 27퍼에서 틀림.
#include<iostream>
#include<algorithm>
#include<vector>
#include<stack>
#include<cstdio>
using namespace std;
// 16:55
int cnt[101];
int main()
{
// 멀티탭 구멍의 개수 n과 전기 용품의 총 사용횟수 k가 주어짐.
// 23
// 32 -> no
// 23 -> no
// 1을 꽂기 전에 기존에 멀티탭에 잇는 것들 중에서
// 어떤 것을 뺄까가 가장 중요하.ㅁ
// 12 31 ?
// 뒤에 2가 나오므로
// 12로 가야함.
// 그 다음 : 2 : no
// 7 -> ok
// 1 2 3 7
// 1 3 2 1
// 카운팅을 하다가 카운팅이 가장 작은 것을 빼는 것이 최선이지
// 않을까란? 생각을 함.
// 1을 넣는 시점에서
// 1 2 3 7
// 1 1 0 1
// 이므로 가장 작은 3을 빼자.
// 이거를 어떻게 표현할 것이냐가 관건임.
// 2 3
// 1 을 넣기 전에 3을 빼자
// 비트마스킹으로 해보자.
int n, k;
cin >> n >> k;
int bit = 0;
int vv[101];
for (int i = 0; i < k; ++i)
{
int num;
cin >> num;
vv[i] = num;
cnt[num]++;
}
vector<int>v;
int res = 0;
for (int i = 0; i < k; ++i)
{
//cnt[i];
cnt[cnt[i]]--;
//auto iter = find(v.begin(), v.end(), cnt[i]);
if (v.size() == n)
{
auto iter = find(v.begin(), v.end(), vv[i]);
// 존재할 경우 패스
if (iter != v.end())
continue;
// 이후에 카운팅된 값중에서 가장 작은 원소에 있는 것을
// erase 한 다음에 , 다음거를 push하자
int ele = -1;
int mmin = 1000;
// 벡터에 있는 것중에서 가장 작은거를 찾아야 함.
for (auto iter : v)
{
if (mmin > cnt[iter])
{
mmin = cnt[iter];
ele = iter;
}
// 어떤 원소인지를 알아야 함.
}
auto iter1 = find(v.begin(), v.end(), ele);
v.erase(iter1);
v.push_back(vv[i]);
++res;
}
else
{
auto iter = find(v.begin(), v.end(), vv[i]);
// 존재할 경우 패스
if (iter != v.end())
continue;
v.push_back(vv[i]);
}
}
printf("%d", res);
}
4 20
1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5
-> should print 4, but prints 6
: size가 k와 동일할 경우, 만약에 위의 반례를 들어보면
: 내가 생각한 풀이전략이 모든 예시에 적용이 될것인가에 대한 생각을 하자.
내가 왜 이렇게 생각을 했냐면?
: 현재 입력 예제로 주어진 것으로만 생각을 했기 때문에 발생한 결과다.
-중복일 경우에 대해서도 생각을 했지만, 위의 반례를 처리할 수 없음.