본문 바로가기

코드포스

[코드포스 Practice17] C. MUH and Important Things

 

좀 찜찜한 문제..

모든 경우의 수를 어떻게 구할지 몰라서 넘겼었다.

이거 가능한 경우가 같은게 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 쓴 것 같다

이것도 구경하러 가야지