9oormthon 구현 5일차: 이진수 정렬

PEA은하·2023년 8월 18일
post-thumbnail

Problem


문제 설명

주어진 정수들을 정렬하기 위해 2개의 조건을 설정한다.

  1. 2진수로 변환 후, 1의 개수 → 내림차순
  2. (원래 10진수) 숫자 → 내림차순

필요한 함수

PythonC++C
2진수 변환bin( val )#include < bitset >
bitset< n > bi_num( val );
특정 문자의 개수 세기str.count( val )size_t bi_cnt = bi_num.count( );
정렬list.sort(key=, reverse=False)
sorted(list, key=, reverse=False)
#include < algorithm >
sort(arr, arr + N, compare);

Submitted Code


Python

from typing import Tuple

 1 N, K = map(int, input().split())
 2
 3 def f(x:str) -> Tuple[int, int]:
 4     x = int(x)
 5     bin_count = bin(x).count('1')	
 6     return bin_count, x
 7 
 8 nums = list(map(f, input().split()))
 9 nums.sort(reverse=True)
10 print(nums[K - 1][1])

Line 1

주어진 정수의 개수 N과 찾으려는 정수의 위치 K를 입력받는다.

Line 3-6

string x를 입력받아

  • xint 자료형으로 변환하고
  • 2진수로 변환했을 때 1의 개수 bin_count를 계산한다.
    • bin( ) 함수의 결과는 '0b001'과 같이 string으로 반환된다.

Line 8

map 함수로 정수들을 (bin_count, x)로 변환한다.

Line 9

bin_count를 1순위로, x를 2순위로 내림차순 정렬한다.

Line 10

정렬된 정수들 중 K번째 정수를 10진수 형태로 출력한다.

C++

 1 #include <iostream>
 2 #include <algorithm>
 3 #include <vector>
 4 #include <bitset>
 5 using namespace std;
 6 struct Number {
 7     int binary_count;
 8     int decimal;
 9 };
10
11 bool compare(Number num1, Number num2) {
12     if (num1.binary_count == num2.binary_count) {
13         return num1.decimal > num2.decimal;
14     } else {
15         return num1.binary_count > num2.binary_count;
16     }
17 }
18
19 int main() {
20     int N, K;
21     cin >> N >> K;
22
23     vector<Number> nums;
24     for (int i = 0; i < N; i++){
25         Number num;
26         cin >> num.decimal;
27         bitset<21> bi_num(num.decimal);
28         num.binary_count = (int)bi_num.count();
29         nums.push_back(num);
30     }
31	
32     sort(nums.begin(), nums.begin() + N, compare);	
33     cout << nums[K - 1].decimal;
34
35     return 0;
36 }

Code Review


Python

  • array.sort(key=lambda x: (-x[1], x[0]))

볼 때마다 새로운 sortkey 옵션

C++

1. 정수를 2진수로 변환: bitset

2. 정렬: greater



Challenge Review


5번 연속 오답을 제출하면 발동되는 이스터에그가 있다고 해서 신나서 달려갔더니...

모르고 봤으면 놀랐을 것 같긴 하다. (너무 기대가 컸나보다)



Reference

0개의 댓글