코딩 테스트 공부/프로그래머스

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

따갓 2022. 6. 17. 23:09

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

 

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

 

programmers.co.kr

 

[ 풀이 ]

 

먼저 숫자가 짝수인지 홀수인지 판별해야 한다.

 

1. 짝수일 경우

짝수는 비트로 표현하면 항상 맨 오른쪽 비트가 0이 된다. 이 때 숫자에 1을 더하게 되면 마지막 비트만 1로 바뀌게 된다.

즉, 짝수의 경우 원래 수에 + 1 만 해줘도 "서로 다른 비트의 개수가 2 이하이다" 라는 조건을 만족시키게 된다.

 

2. 홀수일 경우

  • 만약 비트 문자열에 0이 없을 경우 비트 문자열의 맨 왼쪽에 0을 추가해준다.
  • 비트 문자열에서 "0"중 가장 맨 오른쪽에 있는 "0" 의 위치에 대한 인덱스를 구한다.
  • n = ( 비트 문자열의 길이 - 인덱스 - 2 ) 라고 했을 때, 기존의 숫자에 + 2^n 하면 정답이 된다. 

[ 전체 코드 ]

class Solution {
    public long[] solution(long[] numbers) {
        long[] answer = new long[ numbers.length ];
        for( int i = 0 ; i < numbers.length ; i++ ){
            String bit = Long.toString( numbers[i] , 2 );
            answer[i] = fx( bit , numbers[i] );
        }
        return answer;
    }
    static long fx( String bit , long num ){        
        if( num % 2 == 0 ) return num + 1 ; 
        else{
            if( bit.indexOf( "0" ) == -1 ){
                bit = "0" + bit;
            } 
            int n = bit.length() - 2 - bit.lastIndexOf("0");            
            return num + (long)Math.pow( 2 , n );
        }        
    }
}