본문 바로가기
알고리즘 & 자료구조/프로그래머스

2개 이하로 다른 비트

by 신재권 2023. 2. 14.
package programmers;

import java.util.Arrays;

public class 두개이하로다른비트 {

   // f(x) = x 보다 크고 x와 비트가 1~2개 다른 수 들 중에서 제일 작은수
   // 2 = 000...0010
   // 3 = 000...0011
   // 4 = 000...0100
   // 5 = 000...0101
   // 6 = 000...0110
   // 7 = 000...0111
   // 8 = 000...1000
   // 9 = 000...1001
   // 10 = 000...1010
   // 11 = 000...1011
   // 12 = 000...1100
   // 13 = 000...1101
   // 14 = 000...1110
   // 15 = 000...1111
   // 16 = 000..10000
   // 17 = 000..10001
   // 18 = 000..10010
   // 19 = 000..10011
   // 20 = 000..10100
   // 21 = 000..10101
   // 22 = 000..10110
   // 23 = 000..10111
   // 24 = 000..11000
   // 25 = 000..11001

   //1 <= numbers.length <= 100,000
   //0 <= numbers[i] <= 10^15 = 1,000,000,000,000,000 (천조)

   // 2, 4, 8, 16 , 32 -> 비트수가 한자리 늘어나는 구간
   // i % 4 ==3 -> i+1 이 아닌 곳
   // f(1) = 2
   // f(2) = 3
   // f(3) = 5 ---
   // f(4) = 5
   // f(5) = 7
   // f(6) = 7
   // f(7) = 11 ---
   // f(8) = 9
   // f(9) = 10
   // f(10) = 11
   // f(11) = 13 ---
   // f(12) = 13
   // f(13) = 14
   // f(14) = 15
   // f(15) = 23 ---
   // f(16) = 17
   // f(17) = 18
   // f(18) = 19
   // f(19) = 21 ---
   // f(20) = 21
   // f(21) = 22
   // f(22) = 23
   // f(23) = 27 ---

   public static long[] solution(long[] numbers) {

      long[] answer = new long[numbers.length];

      for (int i = 0; i < numbers.length; i++) {
         if (numbers[i] % 4 != 3) {
            answer[i] = numbers[i] + 1;
            continue;
         }

         String bit = Long.toBinaryString(numbers[i]);

         if (!bit.contains("0")) { // 0이 없으면
            bit = 0 + bit;
            bit = String.valueOf(bit.charAt(1)) + bit.charAt(0) + bit.substring(2);
         } else {
            int x = bit.lastIndexOf("0");
            bit = bit.substring(0, x) + "10" + bit.substring(x + 2);
         }
         answer[i] = toBinary(bit);
      }

      return answer;
   }

   private static long toBinary(String bit) {
      bit = new StringBuilder(bit).reverse().toString();
      long ans = 0;
      long x = 1L;
      for (int i = 0; i < bit.length(); i++) {
         if (bit.charAt(i) == '1') {
            ans += x;
         }
         x *= 2;
      }

      return ans;
   }

   public static void main(String[] args) {
      System.out.println(Arrays.toString(solution(new long[] {1_000_000_000_000_000L})));
      System.out.println(Arrays.toString(solution(new long[] {2, 7})));
      System.out.println(Arrays.toString(solution(new long[] {343, 779, 891})));//347,781, 893
   }
}

'알고리즘 & 자료구조 > 프로그래머스' 카테고리의 다른 글

다리를 지나는 트럭  (0) 2023.02.16
2XN 타일링  (0) 2023.02.15
모음 사전  (0) 2023.02.13
파일명 정렬  (0) 2023.02.12
프렌즈 4 블록  (0) 2023.02.11