[구름톤 챌린지 1주 차 학습 일기] 5일차 미션 문제 5. 이진수 정렬 (java)
Problem Solving/goorm

[구름톤 챌린지 1주 차 학습 일기] 5일차 미션 문제 5. 이진수 정렬 (java)

728x90

https://level.goorm.io/exam/195687/%EC%9D%B4%EC%A7%84%EC%88%98-%EC%A0%95%EB%A0%AC/quiz/1

 

구름LEVEL

난이도별 다양한 문제를 해결함으로써 SW 역량을 향상시킬 수 있습니다.

level.goorm.io


728x90

 

내 생각

2진수로 바꿨을 때, 1의 개수를 세고 이를 조건에 맞게 정렬해 주면 된다.

나는 1의 개수를 세는 것을 비트 연산자를 이용했고,

2차원 배열에 원래의 10진수 값과 1의 개수를 저장해 정렬해 주었다.


import java.io.*;
import java.util.*;

class Main {
	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st;
		
		st = new StringTokenizer(br.readLine());
		int N = Integer.parseInt(st.nextToken());
		int K = Integer.parseInt(st.nextToken());
		
		int[][] arr = new int[N][2]; // arr[i][0] := 원래의 10진수 값, arr[i][1] := 2진수로 변환했을 때의 1의 개수
		st = new StringTokenizer(br.readLine());
		for(int i = 0; i < N; i++) {
			int num = Integer.parseInt(st.nextToken());
			int tmp = num;
			
			int n = 0; // 1의 개수
			while(tmp > 0) { // 비트 연산을 이용하여 1의 개수 세기
				if((tmp & 1) == 1) n++;
				tmp = tmp >> 1;
			}
			
			arr[i][0] = num;
			arr[i][1] = n;
		}
		
		// 정렬
		Arrays.sort(arr, (o1, o2) -> o1[1] == o2[1] ? o2[0] - o1[0] : o2[1] - o1[1]);
		
		// 출력
		System.out.println(arr[K - 1][0]);
	}
}
728x90