๊ด€๋ฆฌ ๋ฉ”๋‰ด

Unfazedโ—๏ธ๐ŸŽฏ

๋ฐฑ์ค€ 2830 ํ–‰์„ฑ X3 ๋ณธ๋ฌธ

๋ฌธ์ œ ํ•ด๊ฒฐ (PS)/๋ฌธ์ œ ํ’€์ด

๋ฐฑ์ค€ 2830 ํ–‰์„ฑ X3

9taetae9 2023. 12. 20. 17:39
728x90

์ฒซ ์‹œ๋„) ์‹œ๊ฐ„ ์ดˆ๊ณผ 

public class Main {
    public static void scorecalculator(int[] people){
        int score = 0;
        for(int i=0; i<people.length-1; i++){
            for(int j=i+1; j<people.length; j++){
                score+=people[i]^people[j];
            }
        }

        System.out.println(score);
    }
    public static void main(String[] args) {
        int N;
        Scanner sc = new Scanner(System.in);

        N= sc.nextInt();

        int[] people = new int[N];
        for(int i=0; i<N; i++){
            people[i]=sc.nextInt();
        }

        scorecalculator(people);
    }
}

 

์‹œ๊ฐ„ ์ดˆ๊ณผ๊ฐ€ ๋œจ๊ธธ๋ž˜ Scanner๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๊ทธ๋Ÿฐ๊ฐ€๋ณด๋‹ค ์‹ถ์–ด BufferedReader๋กœ ๋‹ค์‹œ ์ˆ˜์ •ํ•ด ๋ณด์•˜๋‹ค.

 

๋‘๋ฒˆ์งธ ์‹œ๋„) ์‹œ๊ฐ„ ์ดˆ๊ณผ

public class Main {
    public static void scorecalculator(int[] people){
        int score = 0;
        for(int i=0; i<people.length-1; i++){
            for(int j=i+1; j<people.length; j++){
                score+=people[i]^people[j];
            }
        }

        System.out.println(score);
    }
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int N = Integer.parseInt(br.readLine());
        int[] people = new int[N];

        for(int i=0; i<N; i++){
            people[i]=Integer.parseInt(br.readLine().trim());
        }

        scorecalculator(people);
    }
}

์—ฌ์ „ํžˆ ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋ฐœ์ƒํ–ˆ๊ณ , ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ O(n^2)์ธ ๊ฒƒ์ด ๋ฌธ์ œ์˜€๋‹ค.

 

์„ธ๋ฒˆ์งธ ์‹œ๋„)

XOR ์—ฐ์‚ฐ์€ ๋‘ ๋น„ํŠธ๊ฐ€ ์„œ๋กœ ๋‹ค๋ฅผ ๋•Œ๋งŒ 1์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ๊ฐ ๋น„ํŠธ ์œ„์น˜์—์„œ 1๊ณผ 0์ด ์–ผ๋งˆ๋‚˜ ๋งŒ๋‚˜๋Š”์ง€์— ์ฃผ๋ชฉํ•ด์•ผํ•œ๋‹ค.

๊ฐ ๋น„ํŠธ์˜ 1๊ณผ 0์˜ ๊ฐœ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•˜๊ณ  ํ•ด๋‹น ๊ฐœ์ˆ˜๋ฅผ ๊ณฑํ•ด์ฃผ๋ฉด ํ•ด๋‹น ๋น„ํŠธ ์œ„์น˜์—์„œ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  XOR ๊ฒฐ๊ณผ ํ•ฉ์„ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.

public class Main {
    public static void scorecalculator(int[] people){
        long score = 0; //int score = 0;  => ์˜ค๋‹ต!
        int n = people.length;

        for(int bit = 0; bit<31; bit++) {//๊ฐ ๋น„ํŠธ๋งˆ๋‹ค
            long countOne = 0;

            for(int person : people){
                if((person & (1<<bit)) != 0){
                    countOne++; // 1์ธ ๋น„ํŠธ ๊ฐœ์ˆ˜ ์„ธ๊ธฐ
                }
            }
            long countZero = n-countOne;
            score += (1L << bit) * countOne * countZero;
        }

        System.out.println(score);
    }
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int N = Integer.parseInt(br.readLine());
        int[] people = new int[N];

        for(int i=0; i<N; i++){
            people[i]=Integer.parseInt(br.readLine().trim());
        }

        scorecalculator(people);
    }
}

 

ํ•ต์‹ฌ ๋กœ์ง์— ์‚ฌ์šฉ๋œ ๊ธฐ๋ณธ ๊ฐœ๋…

๋น„ํŠธ AND ์—ฐ์‚ฐ์ž & : ๋‘ ์ •์ˆ˜์˜ ์ด์ง„ ํ‘œํ˜„ ๋น„๊ต ์‹œ, ๊ฐ ๋น„ํŠธ ์œ„์น˜์—์„œ ๋ชจ๋‘ 1์ธ ๊ฒฝ์šฐ์—๋งŒ ํ•ด๋‹น ์œ„์น˜์˜ ๊ฒฐ๊ณผ๊ฐ€ 1์ด ๋œ๋‹ค.

ex) 1010(2) & 1100(2) = 1000(2)

 

๋น„ํŠธ AND ์—ฐ์‚ฐ์€ ํŠน์ • ๋น„ํŠธ๋“ค์ด 1์ธ์ง€ ํ™•์ธํ•˜๊ณ  ์‹ถ์€ ์ƒํ™ฉ์— ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋‹ค. ํ•ด๋‹น ๋น„ํŠธ ์œ„์น˜์—์„œ 1์ด ์žˆ๋Š” ๋งˆ์Šคํฌ๋ฅผ ๋งŒ๋“ค๊ณ  & ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜๋ฉด ๋œ๋‹ค.

ex) ์ •์ˆ˜ 'n'์—์„œ 3๋ฒˆ์งธ ๋น„ํŠธ(2^2์˜ ์œ„์น˜)๊ฐ€ 1์ธ์ง€ n & (1<<2)์˜ ์—ฐ์‚ฐ์„ ํ†ตํ•ด ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ฒฐ๊ณผ๊ฐ€ 1์ด๋ผ๋ฉด ํ•ด๋‹น ๋น„ํŠธ๋Š” 1์ด ๋œ๋‹ค.

 

(num <<bit) bit๋งŒํผ num์„ ๋ ˆํ”„ํŠธ ์‰ฌํ”„ํŠธ ์—ฐ์‚ฐ 

1 << 0 = 1

1 << 1 = 10(2)

1 << 2 = 100(2)

...

1 << n = 2^(n-1)

 

 

๊ทธ๋Ÿฐ๋ฐ ์ด๋ฒˆ์—๋„ ํ‹€๋ ธ๋‹ค๋Š” ๊ฒฐ๊ณผ๋ฅผ ๋ฐ›์•˜๊ณ , ์›์ธ์€ int score = 0;์— ์žˆ์—ˆ๋‹ค. ์ •์ˆ˜ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ ๋ฌธ์ œ์˜€๊ณ , int๋งŒ long์œผ๋กœ ๋ฐ”๊พธ์–ด์ฃผ์—ˆ๋”๋‹ˆ ํ•ด๊ฒฐ๋˜์—ˆ๋‹ค.

 

์ •์ˆ˜ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ : 'int' ํƒ€์ž…์€ 32๋น„ํŠธ ์ •์ˆ˜๋ฅผ ์ €์žฅํ•˜๊ณ , ์ตœ๋Œ€๊ฐ’์€ ์•ฝ 2.1์–ต(2^31 -1)์ด๋‹ค. ๊ณ„์‚ฐ ๊ฒฐ๊ณผ๊ฐ€ 'int'์˜ ์ตœ๋Œ€๊ฐ’์„ ์ดˆ๊ณผํ•˜๋ฉด, ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ์Œ์ˆ˜ ๊ฐ’์ด ๋‚˜์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

 

๋ฌธ์ œ์˜ ์ž…๋ ฅ ํฌ๊ธฐ์™€ ๊ฒฐ๊ณผ : ๋ฌธ์ œ์—์„œ ๊ฑฐ์ฃผ๋ฏผ์˜ ์ˆ˜ 'N'์ด ์ตœ๋Œ€ 1,000,000์ด๊ณ , ๊ฐ ์ด๋ฆ„๋„ ์ตœ๋Œ€ 1,000,000์ด๋ผ๊ณ  ํ•˜์˜€๋‹ค. ๋ชจ๋“  ๊ฐ€๋Šฅํ•œ ์Œ์˜ ์นœ๋ฐ€๋„๋ฅผ ๋”ํ•œ๋‹ค๋ฉด 'int'๋ฒ”์œ„๋ฅผ ์ดˆ๊ณผํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋‹ค. ์˜ˆ๋ฅผ๋“ค์–ด, ๋ชจ๋“  ๊ฑฐ์ฃผ๋ฏผ์˜ ์ด๋ฆ„์ด 1,000,000์ด๊ณ , ๊ฑฐ์ฃผ๋ฏผ์˜ ์ˆ˜๊ฐ€ 1,000,000์ด๋ผ๋ฉด, ์ตœ์ข…ํ•ฉ์€ ๋งค์šฐ ํฐ ์ˆ˜๊ฐ€ ๋ ๊ฒƒ์ด๋‹ค.

 

'long'์˜ ์‚ฌ์šฉ : 'long'์€ 64๋น„ํŠธ ์ •์ˆ˜๋ฅผ ์ €์žฅํ•˜๋ฉฐ, ์ตœ๋Œ€๊ฐ’์€ ์•ฝ 9.2๊ฒฝ(2^63-1)์ด๋‹ค. ๋”ฐ๋ผ์„œ 'long'์„ ์‚ฌ์šฉํ•˜๋ฉด ํ›จ์”ฌ ๋” ํฐ์ˆ˜๋“ค๋„ ์•ˆ์ „ํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์–ด ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.

728x90