본문 바로가기
Beakjoon&프로그래머스/Java

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

by 현장 2026. 4. 6.

-Code

class Solution {
    public long[] solution(long[] numbers) {
        long[] answer = new long[numbers.length];
        for (int i = 0; i < numbers.length; i++) {
            answer[i] = getNum(numbers[i] );
        }
        return answer;
    }
	// 2개 이하로 다른 비트 찾기
    private long getNum(long check) {
        // 짝수인 경우에는 맨 마지막 비트가 0이므로 1개만 바꾸면 1개 이하
        if (check % 2 == 0) {
            return check + 1;
        }
        // 홀수인 경우 0을 찾아 1로 바꾸는게 해당 값만 바꾸ㅏ사 1개거나
        // 이전값을 1증가시키는 경우는 2개 바꾸는 거므로 0을 찾아서 변경
        String checkBin = "0" + Long.toBinaryString(check);
        // 0 위치 찾기
        int zeroIdx = 0;
        for (int i = checkBin.length() - 1; i >= 0; i--) {
            if (checkBin.charAt(i) == '0') {
                zeroIdx = i;
                break;
            }
        }
        // 0을 1로 바꾸고 이전 비트의 값을 0으로 변경
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < checkBin.length(); i++) {
            if (i == zeroIdx + 1) {
                sb.append('0');
            } else if (i == zeroIdx) {
                sb.append('1');
            } else {
                sb.append(checkBin.charAt(i));
            }
        }
        return Long.parseLong(sb.toString(), 2);
    }
}

처음에 반복문으로 찾으려 했으나 시간 초과 문제가 발생할 수 있었습니다.

그래서 이를 어떻게 해야 시간문제를 해결하지 고민을 하다 못 찾아서 힌트를 찾아보니 짝수면 1만 증가해도 답이고 홀수의 경우 0을 변경하는 게 가장 작은 수여서 수가 아닌 문자열의 개수만큼만 돌면 되어 시간문제가 해결됨을 알고 해결했습니다.