study
다음 큰 숫자[프로그래머스]
Date: 2026-01-22 00:54
Update: 2026-01-22 01:00


[프로그래머스] 다음 큰 숫자

내 접근법:

완전 탐색방식

  1. 현재 숫자의 1의 갯수를 셉니다
  2. 매번 현재 숫자의 1의 갯수와 비교대상의 숫자 개수를 셉니다
  3. 1의 갯수가 같다면 비교대상이 더큰지 확인하고 반환합니다.
#include <string>
#include <vector>

using namespace std;

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

int solution(int n) {
    int answer = 0;
    int temp = n + 1;
    while(1)
    {
        if(numberToBinaryOne(n) == numberToBinaryOne(temp) && temp > n)
            return temp;
        else 
            temp++;
    }
    return answer;
}

다른 풀이법: Bitset 활용하기

  1. bitset 헤더를 사용하여 2진수 변환과 1의 개수를 bitset의 count 함수를 이용하여 셉니다.
#include <string>
#include <vector>
#include <bitset> // 헤더 추가

using namespace std;

int solution(int n) {
    // n의 1의 개수를 미리 구함
    int num = bitset<20>(n).count();

    while (1) {
        n++;
        // 증가시킨 n의 1의 개수가 num과 같으면 리턴
        if (bitset<20>(n).count() == num) return n;
    }
}

다른 풀이법: 비트 조작 활용

  1. 숫자의 가장 오른쪽 1뭉치를 찾아 왼쪽으로 이동 시키고, 나머지 1들을 오른쪽 끝으로 정렬합니다.
#include <string>
#include <vector>

using namespace std;

int solution(int n) {
    int smallest, ripple, ones;

    // 1. 가장 오른쪽의 1을 찾음 (smallest)
    smallest = n & -n;

    // 2. 가장 오른쪽 1과 그 왼쪽의 비트들을 더해 패턴을 만듦 (ripple)
    ripple = n + smallest;

    // 3. 원래 숫자와 XOR 후 shift 하여 나머지 1의 개수를 맞춤 (ones)
    ones = n ^ ripple;
    ones = (ones) / smallest >> 2;

    // 4. 최종 결과 결합
    return ripple | ones;
}