주어진 정수들을 정렬하기 위해 2개의 조건을 설정한다.
| Python | C++ | 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); |
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])
주어진 정수의 개수 N과 찾으려는 정수의 위치 K를 입력받는다.
string x를 입력받아
x를 int 자료형으로 변환하고bin_count를 계산한다.bin( ) 함수의 결과는 '0b001'과 같이 string으로 반환된다.map 함수로 정수들을 (bin_count, x)로 변환한다.
bin_count를 1순위로, x를 2순위로 내림차순 정렬한다.
정렬된 정수들 중 K번째 정수를 10진수 형태로 출력한다.
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 }

array.sort(key=lambda x: (-x[1], x[0]))볼 때마다 새로운 sort의 key 옵션
5번 연속 오답을 제출하면 발동되는 이스터에그가 있다고 해서 신나서 달려갔더니...

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