λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

Algorithm/BOJ

[BOJ] μ˜μ›…μ΄λŠ” 2의 κ±°λ“­ μ œκ³±μ„ μ’‹μ•„ν•΄! μ˜μ›…μ΄λŠ” 2의 κ±°λ“­ μ œκ³±μ„ μ’‹μ•„ν•΄!(20153)

[λ°±μ€€(BOJ)] 20153_μ˜μ›…μ΄λŠ” 2의 κ±°λ“­ μ œκ³±μ„ μ’‹μ•„ν•΄! μ˜μ›…μ΄λŠ” 2의 κ±°λ“­ μ œκ³±μ„ μ’‹μ•„ν•΄! C++

문제 : BOJ_20153번 μ˜μ›…μ΄λŠ” 2의 κ±°λ“­ μ œκ³±μ„ μ’‹μ•„ν•΄! μ˜μ›…μ΄λŠ” 2의 κ±°λ“­ μ œκ³±μ„ μ’‹μ•„ν•΄!

문제 μ„€λͺ…

μš°μ„  n 개의 μžμ—°μˆ˜κ°€ μ£Όμ–΄μ§‘λ‹ˆλ‹€.

이 n 개의 수λ₯Ό λͺ¨λ‘ μ΄μ§„μˆ˜λ‘œ λ°”κΎΈκ³  각 자리의 1의 개수λ₯Ό μ‘°νšŒν•©λ‹ˆλ‹€.

각 자리수의 1의 κ°œμˆ˜κ°€ ν™€μˆ˜μ΄λ©΄ μ΅œμ’… 결괏값에 (2^자리수)λ₯Ό 더해주고, 짝수이면 λ”ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

μ΄λ•Œ μ΅œμ’… 결괏값이 μ΅œλŒ€κ°€ 될 수 μžˆλ„λ‘ n 개의 μžμ—°μˆ˜ 쀑 μ΅œλŒ€ ν•˜λ‚˜μ˜ μžμ—°μˆ˜λ₯Ό μ œμ™Έν•  수 μžˆμŠ΅λ‹ˆλ‹€.

λ§ˆμ§€λ§‰μœΌλ‘œ 결괏값을 띄어쓰기 없이 두 번 좜λ ₯ν•˜λ©΄ μ •λ‹΅μž…λ‹ˆλ‹€.


Solution

μ™„μ „ 탐색, μˆ˜ν•™

μ£Όμ–΄μ§ˆ 수 μžˆλŠ” 수의 μ΅œκ³ κ°’μ΄ 2222222μ΄λ―€λ‘œ, 그에 맞게 2222222의 μˆ«μžμ— μ΄μ§„μˆ˜λ‘œ 바꿨을 λ•Œμ˜ 자릿수λ₯Ό 이차원 λ°°μ—΄λ‘œ μ„ μ–Έν•΄ μ€λ‹ˆλ‹€.

그런 λ‹€μŒ 각 μžμ—°μˆ˜λ₯Ό μ΄μ§„μˆ˜λ‘œ λ°”κΎΈκ³  μ•žμ„œ λ§Œλ“  배열에 자리수의 정보λ₯Ό λ„£μ–΄ μ€λ‹ˆλ‹€.

κ·Έ 뒀에 n 개의 λͺ¨λ“  μžμ—°μˆ˜μ˜ 각 μ΄μ§„μˆ˜ 자리수λ₯Ό κΈ°μ€€μœΌλ‘œ κ³„μ‚°ν•œ μ΅œλŒ“κ°’μ„ κ΅¬ν•œ λ’€, n 번 μˆœνšŒν•˜λ©° 각 μžμ—°μˆ˜λ₯Ό μ œμ™Έν–ˆμ„ λ•Œμ˜ κ°’λ“€κ³Ό μ΅œλŒ“κ°’μ„ λΉ„κ΅ν•©λ‹ˆλ‹€.

μ΄λ ‡κ²Œ μ™„μ „ νƒμƒ‰μœΌλ‘œ λ‚˜μ˜¨ μ΅œλŒ“κ°’μ΄ 정닡이 λ©λ‹ˆλ‹€.

μ‹œκ°„ λ³΅μž‘λ„κ°€ κΉŒλ‹€λ‘œμš΄ λ¬Έμ œμ΄λ―€λ‘œ, 쀄일 수 μžˆλŠ” 연산듀은 μ΅œλŒ€ν•œ 쀄여야 ν•©λ‹ˆλ‹€.


Description

  • pow ν•¨μˆ˜μ˜ μ‚¬μš©μ„ 쀄이기 μœ„ν•΄ μ²˜μŒμ— 배열에 pow ν•¨μˆ˜μ˜ 값을 λͺ¨λ‘ ν• λ‹Ήν–ˆμŠ΅λ‹ˆλ‹€.

#include <iostream>
#include <algorithm>
#include <stack>
#include <cmath>
using namespace std;
int value[23];
int numValue[2222223][23];
int powArr[23];
int main(){
    for(int i=0;i<23;i++) powArr[i] = pow(2,i);
    int n;
    cin >> n;
    for(int i=0;i<n;i++){
        int num;
        cin >> num;
        stack<int> s;
        int cnt = 0;
        while(num){
            if(num%2){
                numValue[i][cnt]=1;
                value[cnt] += 1;
            }
            num/=2;
            cnt++;
        }
    }
    for(int i=0;i<22;i++){
        value[i]%=2;
    }
    int result = 0;
    for(int i=22;i>=0;i--){
        if(value[i]) result+=powArr[i];
    }
    int final=result;
    for(int i=0;i<n;i++){
        int nowResult = result;
        for(int j=0;j<22;j++){
            if(numValue[i][j]==0) continue;
            if(value[j]) nowResult -= powArr[j];
            else  nowResult += powArr[j];
        }
        final= max(final,nowResult);
    }
    cout <<final<< final << '\n';
}