본문 바로가기
Algorithm/프로그래머스풀이

[알고리즘 문제풀이] 프로그래머스 - 2개 이하로 다른 비트 / JAVA(자바)

by 계범 2022. 2. 27.

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

 

코딩테스트 연습 - 2개 이하로 다른 비트

 

programmers.co.kr

/**
    1. f(x) 는 x보다 큰 수 중 비트가 1~2개사이에서 다른 것 중 제일 작은 수
    
    2. 현재 수의 비트 중에서 제일 작은 꺼져있는 비트 찾기
    2-1) 전체 켜진 비트와 현재 비트를 xor연산 비트 만들고,
    2-2) 만들어진 비트 중 가장 최소로 켜진 비트를 찾으면 그게 제일 작은 꺼져잇는 비트
    
    3. 꺼져있는 비트를 키고, 이게 최소비트가 아니면 오른쪽꺼는 끈다.
    3-1) 꺼져있는 비트를 키는건, 찾은 비트를 합집합하면 됨.
    3-2) 바로 오른쪽꺼를 끄는건 2진수니까 /2로 하면 바로 한칸 옆 오른쪽임. ~를 통해 해당 비트를 꺼준다음에 교집합으로 꺼버림.
    
**/

class Solution {
    public long[] solution(long[] numbers) {
        
        
        long[] answer = new long[numbers.length];
        
        for(int i = 0; i < numbers.length; i++){
            long n = numbers[i];
            
            if(n == 0){
                answer[i] = 1;
                continue;
            }
            
            // 최소 꺼진 비트 찾기
            long full = -1;
            long xor = full^n;
            long min = xor & (-xor);
            
            
            long onN = 0;
            // 최소 꺼진 비트 오른쪽에 아무것도 없으면 해당 비트 키고 끝
            if(min == 1){
                onN = n | min;
            // 최소 꺼진 비트 키고, 오른쪽에 더 있으면 바로 오른쪽꺼는 끄기
            }else{
                onN = (n & ~(min/2)) | min;
            }
            answer[i] = onN;
        }
        return answer;
    }
}

댓글