주어진 수 n보다 크면서 2진수로 표현했을 때, n과 1의 개수가 같은 수 중 가장 작은 수를 찾는 문제.
가장 작은 다음 큰 수를 찾으려면 2진수로 나타낸 에서 을 만족하는 중 가장 작은 , 즉 자릿값이 1인 자릿수 중에서 가장 작은 자릿수 를 찾아 에 1을 더해준다. 그 후에 최하위비트부터 1의 개수가 부족한 만큼 채워주면 된다.
예제: "78(1001110)의 다음 큰 숫자는 83(1010011)입니다."
6 | 5 | 4 | 3 | 2 | 1 | 0 | ||
---|---|---|---|---|---|---|---|---|
78 | 1 | 0 | 0 | 1 | 1 | 1 | 0 | i = 1 이므로, += 1 |
1 | 0 | 1 | 0 | 0 | 0 | 0 | 1의 개수가 2개 부족 | |
1 | 0 | 1 | 0 | 0 | 0 | 1 | 1의 개수가 1개 부족 | |
83 | 1 | 0 | 1 | 0 | 0 | 1 | 1 |
https://school.programmers.co.kr/learn/courses/30/lessons/12911
cpp code
#include <math.h>
using namespace std;
int solution(int n) {
int zero_cnt = 0;
for (;n>0;zero_cnt++) {
if (n % 2 == 1) break;
n /= 2;
}
int one_cnt = 0;
for (;n>0;one_cnt++) {
if (n % 2 == 0) break;
n /= 2;
}
n += 1;
for (int i=0;i<zero_cnt+one_cnt;i++) n *= 2;
for (int i=0;i<one_cnt-1;i++) n += pow(2, i);
return n;
}