좀 찜찜한 문제..
모든 경우의 수를 어떻게 구할지 몰라서 넘겼었다.
이거 가능한 경우가 같은게 3개 이상이거나 2/2개인 경우라 경우 나눠가면서 풀면 해결...
와..~~
납득은 가는데 찜찜하다. 그렇게도 풀리는구나..
이렇게 풀 것이다
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <functional>
#include <string>
#include <queue>
#include <stack>
#include <set>
using namespace std;
using i64 = long long;
void two_print(vector<int> v[2005], vector<int> two_index)
{
for (int i = 0; i < 2005; i++)
{
if (v[i].size() != 0)
{
if (i == two_index[0])
{
printf("%d %d ", v[two_index[0]][0], v[two_index[0]][1]);
}
else if (i == two_index[1])
{
printf("%d %d ", v[two_index[1]][0], v[two_index[1]][1]);
}
else
{
for (int j = 0; j < v[i].size(); j++)
printf("%d ", v[i][j]);
}
}
}
printf("\n");
for (int i = 0; i < 2005; i++)
{
if (v[i].size() != 0)
{
if (i == two_index[0])
{
printf("%d %d ", v[two_index[0]][1], v[two_index[0]][0]);
}
else if (i == two_index[1])
{
printf("%d %d ", v[two_index[1]][0], v[two_index[1]][1]);
}
else
{
for (int j = 0; j < v[i].size(); j++)
printf("%d ", v[i][j]);
}
}
}
printf("\n");
for (int i = 0; i < 2005; i++)
{
if (v[i].size() != 0)
{
if (i == two_index[0])
{
printf("%d %d ", v[two_index[0]][0], v[two_index[0]][1]);
}
else if (i == two_index[1])
{
printf("%d %d ", v[two_index[1]][1], v[two_index[1]][0]);
}
else
{
for (int j = 0; j < v[i].size(); j++)
printf("%d ", v[i][j]);
}
}
}
printf("\n");
}
void three_print(vector<int> v[2005], vector<int> three_index)
{
for (int i = 0; i < 2005; i++)
{
if (v[i].size() != 0)
{
if (i == three_index[0])
{
printf("%d %d %d ", v[three_index[0]][0], v[three_index[0]][1], v[three_index[0]][2]);
for (int j = 3; j < v[three_index[0]].size(); j++)
{
printf("%d ", v[three_index[0]][j]);
}
}
else
{
for (int j = 0; j < v[i].size(); j++)
printf("%d ", v[i][j]);
}
}
}
printf("\n");
for (int i = 0; i < 2005; i++)
{
if (v[i].size() != 0)
{
if (i == three_index[0])
{
printf("%d %d %d ", v[three_index[0]][1], v[three_index[0]][0], v[three_index[0]][2]);
for (int j = 3; j < v[three_index[0]].size(); j++)
{
printf("%d ", v[three_index[0]][j]);
}
}
else
{
for (int j = 0; j < v[i].size(); j++)
printf("%d ", v[i][j]);
}
}
}
printf("\n");
for (int i = 0; i < 2005; i++)
{
if (v[i].size() != 0)
{
if (i == three_index[0])
{
printf("%d %d %d ", v[three_index[0]][0], v[three_index[0]][2], v[three_index[0]][1]);
for (int j = 3; j < v[three_index[0]].size(); j++)
{
printf("%d ", v[three_index[0]][j]);
}
}
else
{
for (int j = 0; j < v[i].size(); j++)
printf("%d ", v[i][j]);
}
}
}
printf("\n");
}
int main() {
int n;
scanf("%d", &n);
vector<int> v[2005];
for (int i = 0; i < n; i++)
{
int diff;
scanf("%d", &diff);
v[diff].push_back(i+1);
}
vector<int> three_index;
vector<int> two_index;
for (int i = 0; i < 2005; i++)
{
if (v[i].size() >= 3)
{
three_index.push_back(i);
break ;
}
if (v[i].size() == 2 && two_index.size() < 2)
{
two_index.push_back(i);
}
}
if (three_index.size() != 0)
{
printf("YES\n");
three_print(v, three_index);
}
else if (two_index.size() == 2)
{
printf("YES\n");
two_print(v, two_index);
}
else
{
printf("NO");
}
return 0;
}
ㅋㅋㅋ
더럽다.... 정말....
아무리 생각해도 저 복붙코드는 아닌 것 같아서 북님 코드 참고해서 다시 짰다.
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <functional>
#include <string>
#include <queue>
#include <stack>
#include <set>
using namespace std;
using i64 = long long;
vector<int> v[2005];
void print()
{
vector<int> result;
for (int i = 1; i <= 2000; i++)
{
for (auto vi : v[i])
printf("%d ", vi);
}
printf("\n");
}
int main()
{
int n;
scanf("%d", &n);
for (int i = 1; i <= n; i++)
{
int diff;
scanf("%d", &diff);
v[diff].push_back(i);
}
int three_index = 0;
vector<int> two_index;
for (int i = 1; i <= 2000; i++)
{
if (v[i].size() >= 3)
{
three_index = i;
break ;
}
if (v[i].size() == 2)
{
two_index.push_back(i);
}
}
if (three_index == 0 && two_index.size() < 2)
{
printf("NO");
return 0;
}
printf("YES\n");
print();
if (two_index.size() >= 2)
{
swap(v[two_index[0]][0], v[two_index[0]][1]);
print();
swap(v[two_index[1]][0], v[two_index[1]][1]);
print();
}
else
{
swap(v[three_index][0], v[three_index][1]);
print();
swap(v[three_index][0], v[three_index][2]);
print();
}
return 0;
}
전체 코드는 이렇고 하나하나 쪼개서 보자
void print()
{
vector<int> result;
for (int i = 1; i <= 2000; i++)
{
for (auto vi : v[i])
printf("%d ", vi);
}
printf("\n");
}
이건 벡터 배열 출력하는 부분
벡터배열이 아래처럼 되어 있으면
1, 4, 2, 3 순으로 출력한다.
if (three_index == 0 && two_index.size() < 2)
{
printf("NO");
return 0;
}
printf("YES\n");
print();
if (two_index.size() >= 2)
{
swap(v[two_index[0]][0], v[two_index[0]][1]);
print();
swap(v[two_index[1]][0], v[two_index[1]][1]);
print();
}
else
{
swap(v[three_index][0], v[three_index][1]);
print();
swap(v[three_index][0], v[three_index][2]);
print();
}
다음으로 main 함수에서 다른 부분이라면 이건데
ㅋㅋㅋㅋ swap해서 출력하면 되구나
swap 잘 사용해야겠다... (이때까지 int tmp 만들어서 썼음)
내 코드는 출력할 때 00, 01, 10 바꿔서, 출력하는 부분만 6개였는데
이걸 미리 바꿔놓고 출력하는 함수 따로 만들어서 출력만 했네.
아 그리고 어차피 00은 출력해야 하니깐 먼저 출력해놓고 size가 2일 때 / 3 일때 나눠서 출력한 것도 깔끔하다.
다른 코드 보는거 잼따
B번도 난 큐랑 스택 썼는데 북님은 set 쓴 것 같다
이것도 구경하러 가야지
'코드포스' 카테고리의 다른 글
[코드포스 Practice17] E. Day at the Beach (0) | 2020.04.11 |
---|---|
[코드포스 Practice17] D. Pasha and String (0) | 2020.04.11 |
[코드포스 Practice17] B. Bus of Characters (0) | 2020.04.11 |
[코드포스 Practice17] A. Vladik and flights (0) | 2020.04.11 |
[코드포스 Practice17] 후기 (0) | 2020.04.11 |