[프로그래머스]2개 이하로 다른 비트

GomHyeok·2022년 4월 13일
0

📒활용개념

  1. 경우의 수를 나눈 후, 각 경우에 맞는 문제풀이
  2. 진수에 대한 명확한 이해

📌문제설명

양의 정수 x에 대하여 x보다 크고 비트가 1~2개 다른 수들 중 제일 작은 수를 구하여라. 정수들이 담긴 배열 numbers가 매개변수로 주어지고 numbers의 모든 수들에 대하여 값을 차례로 담아 return 하도록 함수를 만들어라.
예시)
2 👉 10 따라서 3 👉 11 이 정답이다.
7 👉 111 따라서 11 👉 1011 이 정답이다.

제한사항)

  • 1 ≤ numbers의 길이 ≤ 100,000
  • 0 ≤ numbers의 모든 수 ≤ 1015

📌구현

#include <string>
#include <vector>
#include <iostream>

using namespace std;

vector<long long> solution(vector<long long> numbers) {
    vector<long long> answer;
    
    for(int i=0; i<numbers.size(); i++){
        long long int bit=1;
        //짝수의 경우
        if(numbers[i]%2==0){
            answer.push_back(numbers[i]+1);
        }
        //홀수의 경우
        else{
        //연속된 1의 마지막 자리를 찾음
            while((numbers[i]&bit)!=0){
                bit*=2;
            }
            bit/=2;
            answer.push_back(numbers[i]+bit);
        }
    }
    
    return answer;
}

이 문제는 주어진 수가 짝수일 때와 홀수일 때의 문제풀이가 다르다.
1. 짝수
짝수의 경우는 어떠한 경우에도 가장 끝의 자리가 0이다. 따라서 가장 마지막 0에 1을 더해주면 위의 조건을 만족하는 수를 구할 수 있다.
예시) 2 👉 3

  1. 홀수
    홀수의 경우에는 가장 작은 자리수의 0을 1로 만들고 그 전의 1을 0으로 더하면 된다. 즉, 연속된 1의 마지막 자리수 만큼의 값을 더해주면 된다.
    예시) 7 👉 0111 👉1011

📌주의점

  • 정확한 상황의 인지가 필요하다.
  • 굳이 진수 변환을 하지 않아도 괜찮다
profile
github : https://github.com/GomHyeok/

0개의 댓글

관련 채용 정보