안녕하세요. 오늘은 선물을 나누어줄 거예요.

문제

https://www.acmicpc.net/problem/30406

아이디어

(0,3), (1,2)는 XOR했을 때 3이 나옵니다.
(1,3), (0,2)는 XOR했을 때 2가 나옵니다.
(0,1),(2,3)은 XOR했을 때 1이 나옵니다.
두 수가 같으면 XOR했을 때 0이 나옵니다.

순서대로 없애주면 됩니다.

소스코드

#include <iostream>
#include <algorithm>
using namespace std;

int main(void)
{
    ios_base::sync_with_stdio(false); cin.tie(NULL);
    int N, i, x, num[4] = { 0 }, ans = 0;
    cin >> N;
    for (i = 0; i < N; i++)
    {
        cin >> x;
        num[x]++;
    }

    int mn = min(num[0], num[3]);
    ans += mn * 3;
    num[0] -= mn;
    num[3] -= mn;
    mn = min(num[1], num[2]);
    ans += mn * 3;
    num[1] -= mn;
    num[2] -= mn;
    
    int a = -1, b = -1;
    for (i = 0; i < 4; i++)
    {
        if (num[i])
        {
            if (a == -1) a = i;
            else b = i;
        }
    }
    if (b == -1) //두개가 아니면
        cout << ans;
    else
    {
        ans += min(num[a], num[b]) * (a ^ b);
        cout << ans;
    }
}


감사합니다.

0개의 댓글