문제 링크 https://programmers.co.kr/learn/courses/30/lessons/77885

문제

양의 정수 x에 대한 함수 f(x)를 다음과 같이 정의합니다.

  • x보다 크고 x와 비트가 1~2개 다른 수들 중에서 제일 작은 수

정수들이 담긴 배열 numbers가 매개변수로 주어집니다. numbers의 모든 수들에 대하여 각 수의 f 값을 배열에 차례대로 담아 return 하도록 solution 함수를 완성해주세요.

제한사항

  • 1 ≤ numbers의 길이 ≤ 100,000
  • 0 ≤ numbers의 모든 수 ≤ 10의 15제곱

풀이 과정

이 문제는 홀수인지, 짝수인지 구분해서 해결해야하는 문제이다.

짝수일 경우에는 비트의 끝자리가 항상 0이기 때문에 다음 숫자가 들어오면
끝자리가 0에서 1로 바뀌게 된다. 그러므로 x보다 큰 값은 항상 현재값 + 1이 된다.

그러나, 홀수일 경우에는 비트의 끝자리가 항상 1이기 때문에 올림수가 발생하게 된다.
1이 연속하는 수를 세어 3번 연속이라면 2의 2제곱, 4번 연속이라면 2의 3제곱 식으로 된다.
즉, 연속된 1 비트의 개수가 n개라고 할 때, n - 1 자리의 비트 수만큼 더해진다.
(2자리의 비트수 = 4, 3자리의 비트수 = 8)

#include <string>
#include <vector>
#include <cmath>

using namespace std;

string binary(long long num){
    string str = "";
    while(num != 0){
        str += to_string(num % 2);
        num /= 2;
    }
    return str;
}
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 cnt = 0;
            string str = binary(numbers[i]);
            for(int j = 0; j < str.size(); j++){
                if(str[j] == '1') cnt++;
                else break;
            }
            answer.push_back(numbers[i] + pow(2, cnt - 1));
        }
    }
    return answer;
}
#include <string>
#include <vector>

using namespace std;
// pow 함수 구현
long long pow(long long a, long long b){
    if(b == 0) return 1;
    else if(b == 1) return a;
    else return a * pow(a, b - 1);
}

string binary(long long num){
    string str = "";
    while(num != 0){
        str += to_string(num % 2);
        num /= 2;
    }
    return str;
}

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 cnt = 0;
            string str = binary(numbers[i]);
            for(int j = 0; j < str.size(); j++){
                if(str[j] == '1') cnt++;
                else break;
            }
            answer.push_back(numbers[i] + pow(2, cnt - 1));
        }
    }
    return answer;
}

댓글남기기