알고리즘 문제 해결/BOJ

[그리디] BOJ 12931 두 배 더하기 (C++)

jmkimmessi 2022. 10. 20. 00:00
반응형

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

 

12931번: 두 배 더하기

모든 값이 0으로 채워져 있는 길이가 N인 배열 A가 있다. 영선이는 다음과 같은 두 연산을 수행할 수 있다. 배열에 있는 값 하나를 1 증가시킨다. 배열에 있는 모든 값을 두 배 시킨다. 배열 B가 주

www.acmicpc.net

 

문제 해결 알고리즘

 

그리디 알고리즘 문제

 

수 중에 홀수가 존재하면 홀수들을 전부 -1 해준다.

수 중에 홀수가 존재하지 않다면 모든 수를 2로 나눠준다.

 

소스 코드

 

#include <bits/stdc++.h>
using namespace std;

int N, result = 0;
int arr[51];

bool is_zero(){

    bool flag = true;

    for(int i=0;i<N;i++){
        if(arr[i]) {
            flag = false;
            break;
        }
    }

    return flag;
}

int main(){
    cin >> N;
    
    for(int i=0;i<N;i++) cin >> arr[i];
    
    while(1){

        if(is_zero()) {
            cout << result;
            break;
        }

        bool div_exist = true;
        for(int i=0;i<N;i++) {
            if(arr[i]%2){
                div_exist = false;
                break;
            }
        }

        if(div_exist){
            for(int i=0;i<N;i++){
                arr[i] /= 2;
            }
            result++;
        }
        else{
            for(int i=0;i<N;i++){
                if(arr[i]%2){
                    result++;
                    arr[i]--;
                }
            }
        }


    }
    
}
반응형