매개변수 nums에 숫자가 주어지면 nums의 원소들을 이진수로 변환했을 때 1의 개수가 적은
것부터 많은 것 순으로 정렬하여 반환하는 프로그램을 작성하세요.
만약 nums = [5, 6, 7, 8, 9]이고 이 원소들을 이진수로 변환하면
5 --> 101 : 1이 2개
6 --> 110 : 1이 2개
7 --> 111 : 1이 3개
8 --> 1000 : 1이 1개
9 --> 1001 : 1이 2개
이고, 이 수들을 이진수에서 1의 개수에 의해 오름차순 정렬하면 [8, 5, 6, 9, 7]이다.
위에 5, 6, 9는 이진수로 변환했을 때 1의 개수가 2개로 동일하면 십진수가 작은순(오름차순)으로 정렬합니다.
입출력 예
| nums | answer |
| ---- | ------ |
| [5, 6, 7, 8, 9] | [8, 5, 6, 9, 7] |
| [5, 4, 3, 2, 1] | [1, 2, 4, 3, 5] |
| [12, 5, 7, 23, 45, 21, 17] | [5, 12, 17, 7, 21, 23, 45] |
제한사항:
• nums의 길이는 1,000을 넘지 않습니다.
• 1 <= nums[i] <= 100,000
2차원 배열을 생성해서 arr[i][0] 자리에는 숫자를 arr[i][1] 자리에는 숫자를 이진수로 바꿨을 때 1의 개수를 넣는다.
그 후 arr[i][1]을 기준으로 정렬한다.
import java.util.*;
class Solution {
public int[] solution(int[] nums){
int[] answer = new int[nums.length];
int[][] tmp = new int[nums.length][2];
for(int i=0; i<nums.length; i++){
int cnt = 0;
int num = nums[i];
while(num > 0){
if(num%2 == 1){
cnt++;
}
num /= 2;
}
tmp[i][0] = nums[i];
tmp[i][1] = cnt;
}
Arrays.sort(tmp, (a,b)->a[1]==b[1]?a[0]-b[0]:a[1]-b[1]);
for(int i=0; i<answer.length; i++){
answer[i] = tmp[i][0];
}
return answer;
}
public static void main(String[] args){
Solution T = new Solution();
System.out.println(Arrays.toString(T.solution(new int[]{5, 6, 7, 8, 9})));
System.out.println(Arrays.toString(T.solution(new int[]{5, 4, 3, 2, 1})));
System.out.println(Arrays.toString(T.solution(new int[]{12, 5, 7, 23, 45, 21, 17})));
}
}
이진수로 바꿔서 1을 셀 때, if로 판별하고 cnt를 넣는 것 뿐만 아닌 num%2한 값을 더해줄 수도 있음
while(tmp > 0){
cnt += (tmp % 2);
tmp = tmp / 2;
}
이런식으로
좋은 정보 감사합니다