[programmers] 29. 2개 이하로 다른 비트
2021. 7. 1. 22:46
https://programmers.co.kr/learn/courses/30/lessons/77885
1. Problem
문제 설명
양의 정수 x에 대한 함수 f(x)를 다음과 같이 정의합니다.
- x보다 크고 x와 비트가 1~2개 다른 수들 중에서 제일 작은 수
예를 들어,
- f(2) = 3 입니다. 다음 표와 같이 2보다 큰 수들 중에서 비트가 다른 지점이 2개 이하이면서 제일 작은 수가 3이기 때문입니다.
수비트다른 비트의 개수
2 | 000...0010 | |
3 | 000...0011 | 1 |
- f(7) = 11 입니다. 다음 표와 같이 7보다 큰 수들 중에서 비트가 다른 지점이 2개 이하이면서 제일 작은 수가 11이기 때문입니다.
수비트다른 비트의 개수
7 | 000...0111 | |
8 | 000...1000 | 4 |
9 | 000...1001 | 3 |
10 | 000...1010 | 3 |
11 | 000...1011 | 2 |
정수들이 담긴 배열 numbers가 매개변수로 주어집니다. numbers의 모든 수들에 대하여 각 수의 f 값을 배열에 차례대로 담아 return 하도록 solution 함수를 완성해주세요.
제한사항
- 1 ≤ numbers의 길이 ≤ 100,000
- 0 ≤ numbers의 모든 수 ≤ 1015
입출력 예
numbersresult
[2,7] | [3,11] |
2. Code
package programmers;
public class skillTestLevel2 {
// 이진수의 숫자가 2이하로 차이나고 입력값보다 큰 수 찾기
public static void main(String[] args) {
long[] numbers = {2,7};
solution(numbers);
}
public static long[] solution(long[] numbers) {
long[] answer = new long[numbers.length];
for(int i = 0; i < numbers.length; i++) {
if(numbers[i] == 1) {
answer[i] = 2;
} else {
String s = Long.toBinaryString(numbers[i]);
for(int j = s.length()-1; j >= 0; j--) {
if(s.charAt(j) == '0' && j == s.length()-1) {
answer[i] = Long.parseLong(s.substring(0,j) + "1", 2);
break;
} else if(s.charAt(j) == '0' && j == s.length()-2) {
answer[i] = Long.parseLong(s.substring(0,j) + "1" + "0", 2);
break;
} else if(s.charAt(j) == '0' && j < s.length()-2) {
answer[i] = Long.parseLong(s.substring(0,j) + "1" + "0" + s.substring(j+2), 2);
break;
} else if(s.charAt(j) == '1' && j == 0) {
answer[i] = Long.parseLong("1" + "0" + s.substring(1), 2);
break;
}
}
}
}
return answer;
}
}
3. Report
주어진 수의 이진수에 0이 있냐 없냐로 나눠서 생각할 수 있다.
0이 있을 경우 맨 마지막 비트가 0이면 맨 마지막 비트를 1로 바꿔주면 된다.
ex) 1110 -> 1111
중간 비트가 0일 경우에는 최대 2비트까지 다를 수 있으므로 뒤에 1비트를 0비트로 바꿔준다 (가장 작은 값이여야함)
ex) 1101 -> 1110 , 1011 -> 1101
마지막으로 모든 수가 1일 경우엔 가장 앞에 1을 붙이고 그다음 비트를 0으로 바꿔준다
ex) 111 -> 1011
'Algorithm > 문제' 카테고리의 다른 글
[programmers] 31. 짝지어 제거하기 (0) | 2021.07.03 |
---|---|
[programmers] 30. 멀쩡한 사각형 (0) | 2021.07.03 |
[programmers] 28. 주식가격 (0) | 2021.07.01 |
[programmers] 27. 최댓값과 최솟값 (0) | 2021.07.01 |
[LeetCode] 26.Climbing Stairs (0) | 2021.06.24 |