Notice
Recent Posts
Recent Comments
Link
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Archives
Today
Total
관리 메뉴

Life Engineering

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

Problem Solving

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

흑개 2022. 3. 1. 22:03

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

 

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

 

programmers.co.kr

class Solution {
    public long[] solution(long[] numbers) {
        long[] answer = new long[numbers.length];
        int cnt=0;
        for (long number: numbers){
            long lastOne=-1;
            long result=number;
            long i=0;
            while (true){
                if ((number & (1L<<i)) >0){    //1발견시
                    lastOne=i;
                    i++;
                }
                else{           //0발견 시 => 1로
                    result=result|(1L<<i);
                    if (lastOne!=-1){   //마지막 1을 0으로
                        result=result^(1L<<lastOne);
                    }
                    answer[cnt++]=result;
                    break;
                }
            }
        }
        
        return answer;
    }
}

1. 숫자를 쭉 0번째부터.. & 연산 해주면서 체크한다. (뒤에서부터 체크) 

  n & (1L << i) 연산 시

=>1이 나올때, 그 위치를 저장하고 i++를 증가시켜 다시 탐색한다.

=>0이 나올 때(즉 뒤에서부터 i번째 자리가 0일때), 그 부분을 1로 바꿔주고 마지막 1이 나온 인덱스에 대해 0으로 바꿔준 후, answer에 넣고 탐색을 종료한다.

 

처음엔 (1<<i) 이렇게 해서 테스트케이스 마지막 2개에 대해 계속 시간초과가 떴다..

질문 목록을 보니까 이렇게 하면 int로 받아들여 제대로 수가 원하는대로 나오지 않음을 알았고, 1 상수를 Long형으로 변환해서 했다니 통과하였다.

 

다른 분들의 코드를 보니 홀/짝으로 구분해서 푸는 방법이 있었다.

짝수면=> +1 해주고 (제일 맨 끝자리가 0일것이므로)

홀수면=>내가 풀었던 방식을 적용한다.