본문 바로가기

코드포스

[코드포스 Practice19] A. Ternary XOR

 

 

아니 이거 문제에 XOR 적혀있어서 XOR이 어디 쓰일까 계속 생각했다.

 

끝까지 왜 XOR인지 모르겠다.

 

난 XOR 같은 거 연산하면 0되는거 쓰려고 기대했다고.

 

암튼.. 문제 읽고 어 이거 배열 두 개 만들어서 2면 1 1, 1이면 1 0, 0이면 0 0 넣으면 되는 거 아닌가? 싶었다.

 

근데 틀렸음ㅎㅎ

 

다시 보니 max(a, b)가 min이 되게 해라는 조건이 있었는데 빼먹고 생각했다.

 

조금 고민해봤는데 어떻게 해야할지 몰라서 B로 넘어갔다.

 

다시 돌아와서 고민해봤는데 21211 이 예시를 보고 힌트를 얻었다.

 

11000

10211

 

앞에서 부터 보면 1 0으로 나뉜 순간 아래쪽 배열에 값이 다 가있다ㅋㅋ

 

1 0인 순간 위 배열이 더 큰 값으로 결정나니 최대한 아래 쪽 배열에 숫자를 몰아서 값을 줄여야 겠구나!

 

 

#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <functional>
#include <string>
#include <queue>
#include <stack>
#include <set>
#include <map>
 
using namespace std;
using i64 = long long;
using ii = pair<int, int>;
 
int main() {
    int n;
    scanf("%d", &n);
    
    for (int i = 0; i < n; i++)
    {
        int x;
        scanf("%d", &x);
        vector <int> a(x);
        vector <int> b(x);
        string input;
        cin >> input;
        bool is_one = false;
        
        for (int j = 0; j < x; j++)
        {
            if (is_one == false)
            {
                if (input[j] == '2')
                {
                    a[j] = 1;
                    b[j] = 1;
                }
                else if (input[j] == '1')
                {
                    a[j] = 0;
                    b[j] = 1;
                    is_one = true;
                }
                else
                {
                    a[j] = 0;
                    b[j] = 0;
                }
            }
            else
            {
                if (input[j] == '2')
                {
                    a[j] = 2;
                    b[j] = 0;
                }
                else if (input[j] == '1')
                {
                    a[j] = 1;
                    b[j] = 0;
                    is_one = true;
                }
                else
                {
                    a[j] = 0;
                    b[j] = 0;
                }
            }
        }
        
        for (int j = 0; j < x; j++)
            cout << a[j];
        cout << endl;
        for (int j = 0; j < x; j++)
            cout << b[j];
        cout << endl;
    }
    
    return 0;
}

 

코드는 이렇게 짰다..

 

이번 코포 특징 : 코드 더럽게 짰음ㅎㅎ;

 

시간 다 돼가고 마음이 급해서 어쩔 수 없었다.

 

암튼 값 최대한 똑같이 나누다가 1인 경우가 되면 1 0 값을 집어넣는데, 이 이후부터 0쪽에 값을 몰아줬다. 

 

북님은 더 깔쌈하게 짰겠지? 내일 코드 구경해야겠다.

 


ㅋㅋㅋㅋ비슷했다 (쉬운 A번인데 그렇겠지!)

 

아 신기한게 위에 입출력 속도 빠르게 하는 걸 추가하셨다.

 

ios::sync_with_stdio(false);
cin.tie(nullptr);

 

이번에는 왜 추가한 거지??

 

모든 테케 합쳐도 5만이라 시간 넉넉하지 않나??

 

 

궁금하지만 내일까지 참아야지