본문 바로가기

Programmers/Level2

2개 이하로 다른 비트

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Solution {
 
    public long[] solution(long[] numbers) {
        long[] answer = new long[numbers.length];
 
        for (int i = 0; i < numbers.length; i++) {
            long num = numbers[i];
            if (num % 2 == 0)
                answer[i] = num + 1;
            else {
                String s = Long.toBinaryString(num);
                int idx = s.lastIndexOf("0");
                // 가장 끝부분의 0을 1로 변환하고 그 뒷자리를 0으로 변환
                if (idx == -1)
                    s = "10" + s.substring(1);
                else
                    s = s.substring(0, idx) + "10" + s.substring(idx + 2);
                answer[i] = Long.parseLong(s, 2);
            }
        }
        return answer;
    }
}
cs

전체 비트를 카운트하면 시간초과가 난다.

각 비트마다의 규칙을 이용하여 해결하였다.

짝수 : num + 1

홀수 : 끝부분의 0을 1로, 그 다음 수를 0으로 변환

 

이전에 시간초과가 났던 코드는 아래와 같다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Solution {
    public long[] solution(long[] numbers) {
        long[] answer = new long[numbers.length];
 
        for (int i = 0; i < numbers.length; i++) {
            long num = numbers[i];
            long j = num + 1;
            
            // 비트가 다른 갯수가 2이하이면 종료
            while (Long.bitCount(num ^ j++> 2);
            answer[i] = j - 1;
        }
        return answer;
    }
}
cs

XOR 연산으로 시도했지만 시간초과가 났다.

'Programmers > Level2' 카테고리의 다른 글

순위 검색  (0) 2021.08.06
[3차] 압축  (0) 2021.08.06
행렬의 곱셈  (0) 2021.08.05
[3차] 방금그곡  (0) 2021.08.04
괄호 회전하기  (0) 2021.08.04