[Java] 이진수 정렬

Sommi·2023년 8월 11일
0

Algorithm

목록 보기
4/5

문제

매개변수 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;
}

이런식으로

profile
넌 할 수 있어 라고 말해 주세요~

1개의 댓글

comment-user-thumbnail
2023년 8월 11일

좋은 정보 감사합니다

답글 달기

관련 채용 정보