하루에 한 문제
[프로그래머스 월간 코드 챌린지 시즌2] 2개 이하로 다른 비트 -Java 본문
https://programmers.co.kr/learn/courses/30/lessons/77885
class Solution {
public long[] solution(long[] numbers) {
long[] answer = new long[numbers.length];
for(int i=0; i<numbers.length; i++) {
long number=numbers[i];
String binary = '0'+Long.toBinaryString(number);
if(number%2==0) {
answer[i]=Long.parseLong(binary.substring(0, binary.length()-1)+"1", 2);
continue;
}
int zeroIndex=findTargetIndex(binary.length()-1, -1, -1, binary, '0');
binary=binary.substring(0, zeroIndex)+'1'+binary.substring(zeroIndex+1);
int oneIndex=findTargetIndex(zeroIndex+1, binary.length(), 1, binary, '1');
binary=binary.substring(0, oneIndex)+'0'+binary.substring(oneIndex+1);
answer[i]=Long.parseLong(binary, 2);
}
return answer;
}
private int findTargetIndex(int start, int end, int plus, String binary, char target) {
while(start!=end) {
if(binary.charAt(start)==target) return start;
start+=plus;
}
return 0;
}
}
문제 로직을 살펴보면
우선 짝수, 홀수 일때로 나누어 집니다.
짝수일 경우에는
무조건 가장 오른쪽자리 비트를 1로 만들어주면 됩니다.
예를들어
2 : 10
4 : 100
6 : 110
처럼 짝수는 무조건 가장 오른쪽 자리가 0 이기 때문에 1로 만들어주면 답입니다.
홀수일 경우에는
오른쪽에서 시작해 가장 처음 만나는 0을 1로 바꾸어줍니다. (더 큰수를 만들어 주기 위해)
그리고 그 자리에서 다시 오른쪽으로 보면서 가장 처음 만나는 1을 0으로 바꿔줍니다.
(위에서 큰수로 바꿧으니 현재 숫자와 차이가 가장 작은 큰 수를 만들어주기 위해 방금 바꾼 비트인덱스 기준 가장 가까운 오른쪽에 있는 1로 된 비트를 0 으로 바꿔줍니다.)
끝~
Comments