https://programmers.co.kr/learn/courses/30/lessons/77885
/**
1. f(x) 는 x보다 큰 수 중 비트가 1~2개사이에서 다른 것 중 제일 작은 수
2. 현재 수의 비트 중에서 제일 작은 꺼져있는 비트 찾기
2-1) 전체 켜진 비트와 현재 비트를 xor연산 비트 만들고,
2-2) 만들어진 비트 중 가장 최소로 켜진 비트를 찾으면 그게 제일 작은 꺼져잇는 비트
3. 꺼져있는 비트를 키고, 이게 최소비트가 아니면 오른쪽꺼는 끈다.
3-1) 꺼져있는 비트를 키는건, 찾은 비트를 합집합하면 됨.
3-2) 바로 오른쪽꺼를 끄는건 2진수니까 /2로 하면 바로 한칸 옆 오른쪽임. ~를 통해 해당 비트를 꺼준다음에 교집합으로 꺼버림.
**/
class Solution {
public long[] solution(long[] numbers) {
long[] answer = new long[numbers.length];
for(int i = 0; i < numbers.length; i++){
long n = numbers[i];
if(n == 0){
answer[i] = 1;
continue;
}
// 최소 꺼진 비트 찾기
long full = -1;
long xor = full^n;
long min = xor & (-xor);
long onN = 0;
// 최소 꺼진 비트 오른쪽에 아무것도 없으면 해당 비트 키고 끝
if(min == 1){
onN = n | min;
// 최소 꺼진 비트 키고, 오른쪽에 더 있으면 바로 오른쪽꺼는 끄기
}else{
onN = (n & ~(min/2)) | min;
}
answer[i] = onN;
}
return answer;
}
}
'Algorithm > 프로그래머스풀이' 카테고리의 다른 글
[알고리즘 문제풀이] 프로그래머스 - 메뉴 리뉴얼 / JAVA(자바) (0) | 2022.03.02 |
---|---|
[알고리즘 문제풀이] 프로그래머스 - 빛의 경로 사이클 / JAVA(자바) (0) | 2022.02.28 |
[알고리즘 문제풀이] 프로그래머스 - 짝지어 제거하기 / JAVA(자바) (0) | 2022.02.26 |
[알고리즘 문제풀이] 프로그래머스 - JadenCase 문자열 만들기 / JAVA(자바) (0) | 2022.02.25 |
[알고리즘 문제풀이] 프로그래머스 - 피로도 / JAVA(자바) (0) | 2022.02.24 |
댓글