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

민지킴·2021년 5월 17일
0

프로그래머스

목록 보기
29/42
post-thumbnail

문제 링크

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

문제 풀이

수학적인 접근을 통해서 풀어야 하는 문제였다.
반복문으로는 시간 초과가 떠서 풀 수 없었다.
설명은 주석으로 적어놨다.

Long -> String 2진법으로 바꾸려면 Long.toBinaryString(long l)
String 2진법 -> long으로 바꾸려면 Long.parseLing(BinaryString, 진수)


코드

import java.util.*;

class Solution {
    public long[] solution(long[] numbers) {
        long[] answer = new long[numbers.length];

            for(int i=0; i<numbers.length; i++){
                String BinaryString =  Long.toBinaryString(numbers[i]);
                if(numbers[i]%2==0){
                    //짝수 가장 낮은 0만 바꾸기
                    //사실상 맨 마지막 자리는 0이기에 +1만 해주면 된다.
                    answer[i] = numbers[i]+1;
       
                }else{
                    //홀수 가장 낮은 0을 1로 바꾸고 , 방금 바꾼것보다는 나중 위치에서 1을 0으로 바꾸기
                    int lastindex =  BinaryString.lastIndexOf("0");
                    int firstindex = BinaryString.indexOf("1",lastindex);
                    if(lastindex==-1){
                        //0이 없는경우 +1을 해주고
                        //앞의 10은 놔두고 나머지는 다 1로 해준다.
                        numbers[i]+=1;
                        BinaryString =  Long.toBinaryString(numbers[i]);
                        BinaryString = BinaryString.substring(0,2)+
                            BinaryString.substring(2,BinaryString.length()).replace("0","1");

                    }else{
                        BinaryString = BinaryString.substring(0,lastindex)+"1"+
                                       BinaryString.substring(lastindex+1,firstindex)+"0"+
                                       BinaryString.substring(firstindex+1,BinaryString.length());
                    }
                
                    answer[i] = Long.parseLong(BinaryString,2);
                }
                
               
            }
        return answer;
    }

}
profile
하루하루는 성실하게 인생 전체는 되는대로

0개의 댓글