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 를 더한 값이 된다는 것이다.