2개 이하로 다른 비트

108번뇌·2021년 9월 23일

https://programmers.co.kr/learn/courses/30/lessons/77885

이문제 못풀었음(시간초과)
내풀이

#include <string>
#include <vector>

using namespace std;

string to_binary(long long ltemp)
{
	string sTemp = "";
	while (1)
	{
		if (ltemp / 2 == 0)
		{
			sTemp = to_string(ltemp % 2) + sTemp;
			break;
		}

		sTemp =  to_string(ltemp % 2) + sTemp;
		ltemp /= 2;
	}
	return sTemp;
}

vector<long long> solution(vector<long long> numbers) {
	vector<long long> answer;

	for (int i = 0; i < numbers.size(); i++)
	{
        if(numbers[i] %2 == 0)  
        {
            answer.emplace_back(numbers[i]+1);
            continue;
        }
		string sTemp = to_binary(numbers[i]);//일단 이진변환하고.
		long long iTemp = numbers[i] + 1;
        
        int flag(0);
		while (1)
		{
			string sTemp1 = to_binary(iTemp);
            if(flag == 0)
            {
                for (int i = 0; i < sTemp.size(); i++)
                {
                    if (sTemp[i] == '0') 
                    {
                        flag =1;
                        break;
                    }

                    if (i == sTemp.size() - 1 && sTemp[i] == '1')
                    {
                        sTemp = "0" + sTemp;//이경우는 전부 1만 있는경우 앞에 0을 하나 붙여준다.
                        flag =1;
                        break;
                    }
                }    
            }
			

			int diffCnt(0);
			for (int j = 0; j < sTemp.size(); j++)
			{
				if (sTemp[j] != sTemp1[j])    diffCnt++;

				if (diffCnt > 2)   break;
			}

			if (diffCnt > 2)
			{
				iTemp++;//다음번으로 넘어간다.   
			}
			else
			{
				answer.emplace_back(iTemp);
				break;
			}
		}
	}
	return answer;
}

답지풀이

#include <string>
#include <vector>

using namespace std;

vector<long long> solution(vector<long long> numbers) {
    vector<long long> answer;
    for (int i = 0; i < numbers.size(); ++i) {
        if (numbers[i] % 2 == 0)
            answer.push_back(numbers[i] + 1);
        else {
            long long bit = 1;
            while (true) {
                if ((numbers[i] & bit) == 0) break;
                bit *= 2;
            }
            bit = bit / 2;
            answer.push_back(numbers[i] + bit);
        }
    }
    return answer;
}

비트연산을 이용해서 풀었다.
비트연산을 하지 않으면 시간초과가 난다.

홀수는 오른쪽에서부터 연속된 1 의 비트의 개수가 f 값과 연관이 있다.
101111 이렇게 연속된 4 개의 1 비트를 가진 수의 f 값을 찾고자 한다면, 101111 👉 110111 이 되어야 한다. (후자가 f 값)
즉! 연속된 1 비트의 개수가 n 개라고 할 때, n - 1 자리의 비트 수만큼 더해진게 f 값이 된다고 할 수 있겠다. 101111 의 f 값은 000111 를 더한 값이 된다는 것이다.

profile
내일 아침 눈을 떳을 때, '기대되는 오늘 하루를 만들기 위해' 나는 오늘도 생각하고 고민한다.

0개의 댓글