C++ 문제풀이/프로그래머스

[프로그래머스 / 연습문제] 다음 큰 숫자

지노링 2022. 11. 1. 17:30
728x90

문제 내용

 

어떤 수 n 를 이진수로 변환했을 때, 그 1의 개수가 같고 n 보다 큰 수를 찾는 문제

 

풀이

 

처음에는 굉장히 어렵게 생각했었다.

n 을 이진수로 변환하고, 그 뒤 1진수에서 뒤의 0을 빼고 앞의 0 을 1로 바꿔주는 ... 뭐랄까 

이진수에서 대소비교를 하려고 했다. 

그러다 문득 생각이 든 것이 대소비교는 그냥 정수로 하고,

그냥 큰 값에서 이진수로 변환하고 1의 개수가 같은것만 판단하면 되는거아냐?

라고 생각하면 난이도가 쉬워진다.

 

항상 이런 생각의 전환이 중요한 것 같다.

 

#include <string>
#include <vector>

using namespace std;

int CountOne(int n)
{
    int cnt = 0;
    while(n > 0)
    {
        if( n % 2 == 1) cnt ++;
        n/= 2;
    }
    
    return cnt;
}



int solution(int n) {
    int answer = 0;
    
    int cnt = CountOne(n);
    
    n++;
    while(1)
    {
        if( cnt == CountOne(n) )
            return n;
        n++;
    }
    
}
728x90