Make Unreal REAL.
article thumbnail
Level 2. 2개 이하로 다른 비트

 

 

num부터 1씩 증가시키면서 비트셋과 XOR 연산을 이용해 다른 비트의 개수를 찾는 풀이이다.

 

하지만, 이 풀이는 시간 초과가 발생한다.

 

// 이 풀이는 시간 초과가 발생한다.
#include <iostream>
#include <vector>
#include <algorithm>
#include <bitset>

using namespace std;

vector<long long> solution(vector<long long> numbers)
{
    auto func = [](long long num)
    {
        int diff = 0;
        bitset<64> bset(num);

        while (diff != 1 && diff != 2)
            diff = (bset ^ bitset<64>(++num)).count();

        return num;
    };

    transform(numbers.begin(), numbers.end(), numbers.begin(), func);

    return numbers;
}

 

반복 없이 바로 정답을 찾는 풀이다.

 

마지막 비트가 0이면 바로 1만 증가시키면 되고, 그렇지 않다면 next_permutation() 함수를 통해 다음으로 가장 작은 수를 찾는다.

  • next_permutation() 함수를 실행하면 항상 2개의 비트가 바뀐다.

 

#include <iostream>
#include <vector>
#include <algorithm>
#include <bitset>

using namespace std;

vector<long long> solution(vector<long long> numbers)
{
    auto func = [](unsigned long long num)
    {
        if (~num & 1)
            return ++num;

        string s = bitset<64>(num).to_string();
        vector<char> v(s.begin(), s.end());

        next_permutation(v.begin(), v.end());

        return bitset<64>(string(v.begin(), v.end())).to_ullong();
    };

    transform(numbers.begin(), numbers.end(), numbers.begin(), func);

    return numbers;
}

 

LS0는 Least significant 0의 줄임말로 쓴 것이며, 가장 우측에 있는 0의 위치를 나타낸다.

 

가장 우측에 있는 0을 1로 바꾸고 그 오른쪽 비트를 0으로 바꾸는 풀이다.

  • 11101 -> 11110
  • 11100 -> 11101

 

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

vector<long long> solution(vector<long long> numbers)
{
    auto func = [](long long num)
    {
        long long LS0 = (~num & -~num);

        return num + LS0 - (LS0 >> 1);
    };

    transform(numbers.begin(), numbers.end(), numbers.begin(), func);

    return numbers;
}

 

아래는 가장 우측의 0을 반복문을 통해 찾는 일반적인 방법이다.

 

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

vector<long long> solution(vector<long long> numbers)
{
    auto func = [](long long num)
    {
        long long LS0 = 1;

        while (num & LS0)
            LS0 <<= 1;

        return num + LS0 - (LS0 >> 1);
    };

    transform(numbers.begin(), numbers.end(), numbers.begin(), func);

    return numbers;
}

'자료구조 & 알고리즘 > 프로그래머스' 카테고리의 다른 글

Level 2. 가장 큰 수  (0) 2023.04.14
Level 2. 카펫  (0) 2023.04.13
Level 2. 전화번호 목록  (0) 2023.04.11
Level 2. 위장  (0) 2023.04.10
Level 2. 더 맵게  (0) 2023.04.09
profile

Make Unreal REAL.

@diesuki4

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

검색 태그