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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


첫번째 접근 방법 :  비트연산(XOR) 접근
비트 연산 문제로 파악하여 비트를 쉽게 파악하기 위해 bitset을 사용
2개 이하 다른 비트를 찾기 위해 XOR 비트연산을 이용하여 [1의 갯수 < 2]의 조건을 찾아 정답을 찾음
하지만 인자값으로 큰 숫자가 들어올 경우 XOR을 해야되는 연산 수가 늘어나며 시간 복잡도에서 문제가 발생

두번째 접근 방법 : 각 비트의 규칙을 찾음

2진 숫자(numbers) 2진 변환(answer) 처음보는 0 뒤의 1숫자 index numbers에 더해주는 값
010(2) 011(3) 0(처음 보는 0 뒤에 1이 없음) +2^0
011(3) 101(5) 1(0의 index는 두번째,2-1 =1) +2^1
100(4) 101(5) 0(처음 보는 0 뒤에 1이 없음) +2^0
101(5) 110(6) 0(0의 index는 첫번째, 1-1=0) +2^0
110(6) 111(7) 0(처음 보는 0 뒤에 1이 없음) +2^0
111(7) 1011(11) 2(0의 index는 세번째 3-1=2) +2^2

규칙을 보면 numbers의 비트들에서 오른쪽에서 처음으로 보는 0 뒤의 1숫자의 index를 2제곱해준 값을
numbers에 더해주면된다. 그렇게하면 비트는 무조건 2이하로 바뀌게 되는 조건을 만족한다.

 

ex)1 010(2)의 [처음보는 0뒤에 1 index]는 0이고, 그 값을 2^n에 대입하면

010 + 2^0 = 011(3) 값이 나온다.

ex2)011(3)의  [처음보는 0뒤에 1 index]는 1이고, 그 값을 2^n에 대입하면

011 + 2^1 = 101(5)  값이 나온다.


코드영역

더보기
#include <string>
#include <vector>
#include <algorithm>
#include <iostream>

using namespace std;

vector<long long> solution(vector<long long> numbers) {
    vector<long long> answer;
    
    for(long long i =0; i < numbers.size() ; i++)
    {
        long long number = numbers[i];
        long long index_0 = 0; //처음보는 0의 index
        
        //number를 이진법으로 변환하며 처음 만나는 0 찾기
        while(number > 0)
        {
            if(number % 2 == 0) { break; } // 해당 이진법의 자리가 0인경우 탈출
            index_0++; //0이 아닌경우 index가 증가함
            number *= 0.5;
        }

        //0뒤의 숫자1의 index를 알아야하기 때문에 -1을 계산
        if(index_0 > 0) { index_0 -= 1;} 

        //number에 더해줄 2^count 를 구함
        long long sum = 1;
        for(long long i =0; i< index_0; i++) {  sum *= 2;}
        
        answer.push_back(numbers[i] + sum);
    }
    return answer;
}

'코딩테스트 > 프로그래머스' 카테고리의 다른 글

LV2.롤케이크 자르기  (0) 2023.10.26
LV2.숫자 변환하기  (0) 2023.10.26
LV.1 같은 숫자는 싫어  (0) 2023.06.09
LV.2 최솟값 만들기  (0) 2023.06.09
LV.1 내적  (0) 2023.06.09

+ Recent posts