본문 바로가기
TIL

[코테연습] 476. Number Complement

by 크라00 2024. 8. 22.

- 비트 문제

 

https://leetcode.com/problems/number-complement/description/?envType=daily-question&envId=2024-08-22

 

- 문제분석

1. 5 = "101" bit 일때, 뒤집는다면, "010" 이되고, 010 = 2 값이나온다.

2. 앞에 0의 숫자를 버릴때 각 숫자의 bit 를 reverse 한 값을 구하여라.

 

- 문제풀이

1. Integer.toBinaryString() 함수로 숫자의 bit 값을 String 으로 구한다.

2. for 문으로 1 일때는 0, 0 일때는 1로 치환하여 StringBuilder 로 각 값을 String 으로 합친다.

3. Integer.parseInt(bit, 2) 함수로 Bit String 값을 10진수로 변환하여 리턴한다.

 

class Solution {
    public int findComplement(int num) {
        String b = Integer.toBinaryString(num);
        int n = b.length();

        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < n; i++) {
            char c = b.charAt(i);
            if (c == '0') {
                sb.append("1");
            } else {
                sb.append("0");
            }
        }

        return Integer.parseInt(sb.toString(), 2);
    }
}

 

 

- 문제풀이2

1. int num 값을 ~(not bit) 로 reverse 한 bit 값을 구한다.

1-1. 이때 5 = 101 경우 32지수까지 000000... 101 -> 11111...010 이 출력되게된다.

2. Integer.highestOneBit(num) 함수로 num 숫자의 최대 bit 값을 구한다.

2-1. 5 일경우 101 -> 100 

3. Integer.highestOneBit(num) 에서 1을 빼서 최대 bit 값의 reverse 한 값을 구한다.

3-1. 4일경우 100 -> 011

4. ~num & Integer.highestOneBit(num) 으로 중복된 값만 출력한다.

5. 010 & 011 -> 010 (2)

 

class Solution {
    public int findComplement(int num) {
        return ~num & (Integer.highestOneBit(num) - 1);
    }
}