백준 2830

오늘내일·2023년 8월 15일
0

코딩테스트

목록 보기
2/4

이중 반복문으로 풀면 쉬울 줄 알았는데..
시간초과..

검색해서 아이디어를 훔쳐왔다

주요 아이디어는 각 자리수마다 위 빨간 글자로 xor연산 결과를 만들어서 합치는 것.. 대단하다..

추가로 주어지는 N의 최대값이 1,000,000이니까 2진법으로는 2^20보다 작기때문에 각 자리수의 연산을 20회로 줄이는 것 등등 아래는 최종코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Baekjoon2830 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());

        int binaryMax = 20;  // 주어지는 수 는 2^20 보다 작다
        int[] resultOne = new int[binaryMax];
        for (int i = 0; i < n; i++) {
            int num = Integer.parseInt(br.readLine());
            for (int j = 0; j < resultOne.length; j++) {
                if ((num & (1 << j)) > 0) {
                    resultOne[j]++;
                }
            }
        }

        long answer = 0l;
        for (int i = 0; i < resultOne.length; i++) {
            answer += (1l << i) * resultOne[i] * (n - resultOne[i]);
        }

        System.out.println(answer);
    }
}

아이디어 참고
https://gukin.tistory.com/14#0%EC%9D%98-%EA%B0%9C%EC%88%98,-1%EC%9D%98-%EA%B0%9C%EC%88%98%EB%A5%BC-%EA%B3%B1%ED%95%B4%EC%84%9C-2i%EB%A5%BC-%EA%B3%B1%ED%95%98%EA%B8%B0

profile
다시 시작합니다.

1개의 댓글

comment-user-thumbnail
2023년 8월 15일

정보 감사합니다.

답글 달기