[프로그래머스] [LV2] 2개 이하로 다른 비트
업데이트:
📚 2개 이하로 다른 비트
링크📎 : https://programmers.co.kr/learn/courses/30/lessons/77885
난이도 ⭐️⭐️
📖 문제
📝 내 풀이
첫번째 풀이
이렇게 풀면 TC 10, 11에서 시간 초과 난다.
import java.util.*;
class Solution {
public long[] solution(long[] numbers) {
long[] answer = new long[numbers.length];
for(int i = 0; i < numbers.length ; i++)
answer[i] = functionF(numbers[i]);
return answer;
}
public long functionF(long n){
if(n%2==0) return n+1;
long num = n+1;
ArrayList<Long> list = new ArrayList<Long>();
while(n!=0){
list.add(n%2);
n/=2;
}
while(true){
long count = 0;
long temp = num;
for(long i : list){
if(temp%2 != i) count++;
temp /= 2;
if(count>2) break;
}
if(temp==0&&count<3) break;
else if(count<2) break;
num++;
}
return num;
}
}
두번째 풀이 - 비트 연산자 이용
import java.util.*;
class Solution {
public long[] solution(long[] numbers) {
long[] answer = new long[numbers.length];
for(int i = 0; i < numbers.length ; i++)
answer[i] = functionF(numbers[i]);
return answer;
}
public long functionF(long n){
long cnt = 0;
long temp = n;
if(n%2==0) return n+1;
else{
while(true){
if(temp%2==0) break;
temp/=2;
cnt++;
}
}
// n+= (1<<cnt) - (1<< cnt-1); 이건 안된다.
n += Math.pow(2,cnt) - Math.pow(2,cnt-1);
return n;
}
}
끝-!
댓글남기기