PS

BOJ 2830 : 행성 X3

lickelon 2024. 7. 10. 16:44
  • 문제 링크 : boj.kr/2830
  • 난이도 : G3
  • 태그 : 비트마스킹, 수학

코드

#include <bits/stdc++.h>

#define all(x) (x).begin(), (x).end()

#define INF 0x7FFFFFFF

using namespace std;

using ll = long long;
using ld = long double;
using pii = pair<int,int>;
using pll = pair<ll, ll>;

int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);

    int n;
    cin >> n;
    vector<ll> cnt(21);
    for(int i = 0; i < n; i++) {
        ll input;
        cin >> input;
        ll idx = 0;
        while(input) {
            cnt[idx++] += input%2;
            input /= 2;
        }
    }

    ll ans = 0;
    for(int i = 0; i < 21; i++) {
        ans += cnt[i] * (n - cnt[i]) * (1 << i);
    }
    cout << ans;

    return 0;
}

풀이

비트별로 구분하여 생각해 볼 수 있다.

어떤 비트가 결과에 몇 번 더해지는지 생각을 해보면, 0과 1이 짝지어질 때마다 결과에 한 번씩 더해지고, 결론적으로 0의 개수 * 1의 개수만큼 결과에 더해지게 된다.

이제 각 비트마다 1의 수를 세어주면 답을 구할 수 있다.

'PS' 카테고리의 다른 글

BOJ 24524 : 아름다운 문자열  (0) 2024.07.12
BOJ 31719 : UDP 스택  (0) 2024.07.11
BOJ 17828 : 문자열 화폐  (0) 2024.07.09
BOJ 15553 : 난로  (0) 2024.07.08
BOJ 13910 : 개업  (0) 2024.07.07