C++:: 프로그래머스 < 2개 이하로 다른 비트 >

jahlee·2023년 6월 9일
0

프로그래머스_Lv.2

목록 보기
55/106
post-thumbnail

생각을 잘못해서 애를 먹은 문제이다.
본인 풀이의 핵심적인 부분은 주어진 숫자 n보다 1이 큰 수는 2진법상으로 뒤에서 부터 처음으로 1이 나오는 지점부터 다르다.
예시로
11001011 (203)이라는 수가 있을때
11001100 (204)은 뒤에서 부터 3번째 지점부터 다른데 이때 원래수와 1개가 달라진 것이므로
원래 수보다 크면서 가장작은수중 도합 2개가 다른것은 처음 다른 지점이 나온 지점의 바로직전이 0이고 이외는 모두 1인 수이다.

#include <string>
#include <vector>
#include <bitset>
#include <algorithm>
#include <cmath>
using namespace std;  

vector<long long> solution(vector<long long> numbers)
{
   vector<long long> answer;
    for(auto number : numbers)
    {
        string str = bitset<64>(number+1).to_string();
        reverse(str.begin(), str.end());//편의를 위해 뒤집어주었다. 안뒤집어도 상관없다.
        int idx;
        for(idx=0;idx<63;idx++)
            if (str[idx] == '1') break;//처음으로 1이나온순간, 원래수와 다른부분 한개찾음
        if (idx >= 2) answer.push_back(number+(long long)pow(2,idx-1));// 예시) 0111 => 2^3-1이므로
        else answer.push_back(number+1);
    }
    return answer;
}

다른 풀이중 쉬프트 연산을 사용한 풀이도 존재하여 참조한다.

#include <vector>
vector<long long> solution(std::vector<long long> numbers)
{
    vector<long long> answer;
    for (long long number : numbers)
    {
        long long bit = 1;
        while ((number & bit) > 0) bit <<= 1;
        answer.push_back(number + bit - (bit >> 1));
    }
    return answer;
}

0개의 댓글