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

giggle·2023년 10월 18일
0
post-custom-banner

문제

2개 이하로 다른 비트


📌 아이디어

첫번째로 떠올린 해결방안은 1씩 증가시키며 주어진 수와 비트를 비교하는 방식입니다. 하지만 테스트 케이스 10, 11에서 시간 초과로 실패했습니다. 코드는 아래와 같습니다.

첫번째 코드

  while (true) {
      result++;

      String binaryString = Long.toBinaryString(result);

      int cnt = 0;
      if (target.length() != binaryString.length()) {
          target = "0" + target;  
      } 

      for (int j = 0; j<binaryString.length(); j++) {
              if (binaryString.charAt(j) != target.charAt(j)) {
                  cnt++;
              }
      }


      if (cnt == 1 || cnt == 2) {
          break;
      }
  }

  answer[i] = result;

이를 해결하고자 비트 패턴을 확인하며 다음과 같은 해결방안을 떠올렸습니다.

  1. 만약 주어진 수가 짝수라면 무조건 1의 자리에 비트가 없기 때문에 1을 더한 값이 답이 됩니다.
  2. 반면에 주어진 수가 홀수라면 비트 끝부터 탐색하여 0이 나오는 지점으로부터 10 비트를 넣어준다면 답이 되게 됩니다.

    예를 들어 11101 이 있다면 11110 이 정답이 됩니다. 혹시 0이 없다면 1111011와 같이 처리하게 됩니다.

📌 코드

import java.util.*;

class Solution {
    public long[] solution(long[] numbers) {
        long[] answer = new long[numbers.length];
        
        for (int i = 0; i<numbers.length; i++) {
            long result = numbers[i];
            String target = Long.toBinaryString(numbers[i]);
            
            if (result % 2 == 0) {
                answer[i] = result + 1;
            } else {
                int idx = target.lastIndexOf("0");
                
                if (idx == -1) {
                    String tmp = "10" + target.substring(1, target.length());
                    answer[i] = Long.parseLong(tmp, 2);
                } else {
                    String tmp = target.substring(0, idx) + "10" + target.substring(idx + 2, target.length());
                    answer[i] = Long.parseLong(tmp, 2);
                }
            }
        }
        return answer;
    }
}

✏️ TIP

1 . Long.toBinaryString(num)Long.toString(num, 2)을 통해 쉽게 비트 변환이 가능합니다.
2. lastIndexOf을 활용하여 String에서 특정 값의 마지막 인덱스를 반환받을 수 있습니다. 혹시, 만족하는 값이 없다면 -1을 반환합니다.
3. substring을 활용하여 String에 대한 슬라이싱이 가능하게 됩니다.
4. Long.parseLong(bit, 2)을 통해 비트를 다시 정수로 변환이 가능합니다.


피드백 및 개선점은 댓글을 통해 알려주세요😊

profile
배움을 글로 기록하는 개발자가 되겠습니다.
post-custom-banner

0개의 댓글