๊ตฌ๋ฆ„ํ†ค ์ฑŒ๋ฆฐ์ง€ 1์ฃผ ์ฐจ ํ•™์Šต ์ผ๊ธฐ - 5
ย - Last update: 2023-08-18

๊ตฌ๋ฆ„ํ†ค ์ฑŒ๋ฆฐ์ง€๋ž€?

๊ตฌ๋ฆ„ ์ด๋ผ๋Š” ๊ณณ์—์„œ ๋ฌธ์ œ ํ’€์ด ์ฑŒ๋ฆฐ์ง€(๊ตฌ๋ฆ„ํ†ค ์ฑŒ๋ฆฐ์ง€)๋ฅผ ํ•œ๋‹ค๊ณ  ํ•ด์„œ ์ฐธ์—ฌ ์ค‘์ด๋‹ค. ์ด๋ฒคํŠธ ๊ธฐ๊ฐ„ ๋™์•ˆ ๋ฌธ์ œ๊ฐ€ ๊พธ์ค€์ด ์˜ฌ๋ผ์˜ค๋ฉฐ, ์ฃผ์— 2ํšŒ์”ฉ (ํ˜น์€ ๊ทธ ์ด์ƒ) ์ฑŒ๋ฆฐ์ง€ ๋ฌธ์ œ๋“ค์— ๋Œ€ํ•ด ํ’€์ด๊ฐ€ ๊ฐ€๋Šฅํ•œ ๋ฌธ์ œ๋“ค์„ ํ’€์ดํ•ด๋ณด๊ณ , ํ›„๊ธฐ๋ฅผ ๋‚จ๊ฒจ๋ณด๋ ค๊ณ  ํ•œ๋‹ค.

๋ฌธ์ œ ํ’€์ด

ํ’€์ด ์ ‘๊ทผ

์ด ๋ฌธ์ œ๋Š” ๋‹จ์ˆœ ์ •๋ ฌ์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฌธ์ œ์ด๋‹ค. ์ •๋ ฌ ์กฐ๊ฑด์„ ์ปค์Šคํ…€ํ•˜๊ธฐ ์œ„ํ•ด, ๊ตฌ์กฐ์ฒด๋ฅผ ํ•˜๋‚˜ ๋งŒ๋“ค์–ด์„œ ๊ทธ ๊ตฌ์กฐ์ฒด์˜ operator๋ฅผ overloading ํ•ด์„œ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋‚˜๋Š” ์ฃผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค.

๋ฌธ์ œ์—์„œ ์ •๋ ฌ ์กฐ๊ฑด์€ ๋‘๊ฐ€์ง€๊ฐ€ ์žˆ์œผ๋ฉฐ, 1์ด ๋™์ผํ•  ๋•Œ 2๋ฅผ ์ ์šฉํ•œ๋‹ค.

  1. ์ˆ˜์— ํฌํ•จ๋œ 1์˜ ์ˆ˜๊ฐ€ ๋งŽ์€ ์ˆœ์œผ๋กœ ๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌ
  2. ๊ทธ ์ˆ˜ ์ž์ฒด๊ฐ€ ํฐ ์ˆœ์œผ๋กœ ๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌ

1์˜ ๊ตฌํ˜„์€ gcc์˜ ๊ฒฝ์šฐ์— ๋‚ด์žฅํ•จ์ˆ˜์ธ __builtin_popcount๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค. ์ •๋ ฌ ๋’ค K๋ฒˆ์งธ ์›์†Œ๋ฅผ ์ถœ๋ ฅํ•˜๋ฉด ๋œ๋‹ค. ์‹œ๊ฐ„๋ณต์žก๋„๋Š” O(NlogโกN)O(N \log N)์ด ์ด๋‹ค.

์ƒ˜ํ”Œ ์ •๋‹ต ์ฝ”๋“œ

#include <bits/stdc++.h>
using namespace std;
struct Number {
int v;
bool operator<(const struct Number& t) const {
if (__builtin_popcount(v) != __builtin_popcount(t.v))
return __builtin_popcount(v) > __builtin_popcount(t.v);
return v > t.v;
}
};
int main() {
int N, K; scanf("%d %d", &N, &K);
vector<Number> A;
for(int i = 0; i < N; ++i) {
int tmp; scanf("%d", &tmp);
A.push_back({tmp});
}
sort(A.begin(), A.end());
printf("%d\n", A[K - 1].v);
return 0;
}
๐Ÿท๏ธ ์ฃผ์ œ ๋ชฉ๋ก: