BOJ 16566. ์นด๋ ๊ฒ์
๐โโ๏ธ[Platinum V] ์นด๋ ๊ฒ์ - 16566
์ฑ๋ฅ ์์ฝ
๋ฉ๋ชจ๋ฆฌ: 22696 KB, ์๊ฐ: 760 ms
๋ถ๋ฅ
์ด๋ถ ํ์, ์๋ฃ ๊ตฌ์กฐ, ๋ถ๋ฆฌ ์งํฉ
์ ์ถ ์ผ์
2024๋ 3์ 10์ผ 14:56:24
๋ฌธ์ ์ค๋ช
์ฒ ์์ ๋ฏผ์๋ ์นด๋ ๊ฒ์์ ์ฆ๊ฒจํ๋ค. ์ด ์นด๋ ๊ฒ์์ ๊ท์น์ ๋ค์๊ณผ ๊ฐ๋ค.
- N๊ฐ์ ๋นจ๊ฐ์ ์นด๋๊ฐ ์๋ค. ๊ฐ๊ฐ์ ์นด๋๋ ์์๋๋ก 1๋ถํฐ N๊น์ง ๋ฒํธ๊ฐ ๋งค๊ฒจ์ ธ ์๋ค. ์ด ์ค์์ M๊ฐ์ ์นด๋๋ฅผ ๊ณ ๋ฅธ๋ค.
- N๊ฐ์ ํ๋์ ์นด๋๊ฐ ์๋ค. ๊ฐ๊ฐ์ ์นด๋๋ ์์๋๋ก 1๋ถํฐ N๊น์ง ๋ฒํธ๊ฐ ๋งค๊ฒจ์ ธ ์๋ค. ์ด ์ค์์ ๋นจ๊ฐ์์์ ๊ณ ๋ฅธ ๋ฒํธ์ ๊ฐ์ ํ๋์ ์นด๋ M๊ฐ๋ฅผ ๊ณ ๋ฅธ๋ค.
- ์ฒ ์๋ ๋นจ๊ฐ์ ์นด๋๋ฅผ ๊ฐ์ง๊ณ ๋ฏผ์๋ ํ๋์ ์นด๋๋ฅผ ๊ฐ์ง๋ค.
- ์ฒ ์์ ๋ฏผ์๋ ๊ณ ๋ฅธ ์นด๋ ์ค์ 1์ฅ์ ๋ค์ง์ด์ง ์ํ๋ก ๋ธ๋ค. ๊ทธ๋ฆฌ๊ณ ์นด๋๋ฅผ ๋ค์ ๋ค์ง์ด์ ๋ฒํธ๊ฐ ํฐ ์ฌ๋์ด ์ด๊ธด๋ค. ์ด ๋์์ K๋ฒ ํด์ ๋ ๋ง์ด ์ด๊ธด ์ฌ๋์ด ์ต์ข ์ ์ผ๋ก ์น๋ฆฌํ๋ค. ํ ๋ฒ ๋ธ ์นด๋๋ ๋ฐ๋์ ๋ฒ๋ ค์ผ ํ๋ค.
์ฒ ์๋ ๋ฐ์ด๋ ๋ง์ ์ฌ์ด๊ธฐ ๋๋ฌธ์ ๋ณธ์ธ์ด ๋ผ ์นด๋๋ฅผ ๋ง์๋๋ก ์กฐ์ํ ์ ์๋ค. ์ฆ, ์นด๋๋ฅผ ๋ฒ๋ฆฌ๊ณ ๋ฏผ์ ๋ชฐ๋ ๋ค์ ๋ค๊ณ ์จ๋ค๊ฑฐ๋ ๋ฏผ์ํํ ์๋ ์นด๋๋ฅผ ๋ด๊ธฐ๋ ํ๋ค.
๋ฏผ์๋ ๋ฐ์ด๋ ์ฌ๋ฆฌํ์์ด๊ธฐ ๋๋ฌธ์ ์ฒ ์๊ฐ ๋ผ ์นด๋๋ฅผ ์์๋ผ ์ ์๋ค. ๊ทธ๋์ ๋ฏผ์๋ ์ฒ ์๊ฐ ๋ผ ์นด๋๋ณด๋ค ํฐ ์นด๋๊ฐ ์๋ค๋ฉด ๊ทธ ์นด๋๋ค ์ค ๊ฐ์ฅ ์์ ์นด๋๋ฅผ ๋ด๊ธฐ๋ก ํ๋ค.
K๋ฒ ๋์ ์ฒ ์๊ฐ ๋ผ ์นด๋๊ฐ ์ ๋ ฅ์ผ๋ก ์ฃผ์ด์ง๋ค. ๊ทธ๋ ๋ค๋ฉด ๋ฏผ์๊ฐ ์ด๋ค ์นด๋๋ฅผ ๋ผ์ง ์ถ๋ ฅํ๋ผ. ๋จ, ๋ฏผ์๊ฐ ์นด๋๋ฅผ ๋ด์ง ๋ชปํ๋ ๊ฒฝ์ฐ๋ ์๋ค๊ณ ๊ฐ์ ํ๋ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์ ์ธ ๊ฐ์ ์์ฐ์ N, M, K๊ฐ ์ฃผ์ด์ง๋ค. (1 โค M โค N โค 4,000,000, 1 โค K โค min(M, 10,000))
๋ค์ ์ค์ ์นด๋์ ๋ฒํธ๋ฅผ ๋ํ๋ด๋ M๊ฐ์ ์์ฐ์๊ฐ ์ฃผ์ด์ง๋ค. ๊ฐ๊ฐ์ ์๋ค์ 1 ์ด์์ด๊ณ N ์ดํ์ด๋ฉฐ ์๋ก ๋ค๋ฅด๋ค.
๋ค์ ์ค์ K๊ฐ์ ์์ฐ์๊ฐ ์ฃผ์ด์ง๋ค. i๋ฒ์งธ ์๋ ์ฒ ์๊ฐ i๋ฒ์งธ๋ก ๋ด๋ ์นด๋์ ๋ฒํธ์ด๋ค. ์ฒ ์๊ฐ ๋ด๋ ์นด๋ ์ญ์ 1 ์ด์ N ์ดํ์ด๋ค.
์ถ๋ ฅ
K์ค์ ๊ฑธ์ณ์ ์๋ฅผ ์ถ๋ ฅํ๋ค. i๋ฒ์งธ ์ค์๋ ๋ฏผ์๊ฐ i๋ฒ์งธ๋ก ๋ผ ์นด๋์ ๋ฒํธ๊ฐ ์ถ๋ ฅ๋์ด์ผ ํ๋ค.
๐ํ์ด
์ฐ์ ํ๋ ๋ฌธ์ ๋ฐ ๋ฐ๋ก ๋งํ๋ค ใ
์ด๋ถ ํ์์ ์ด์ฉํด์ ํ์๋๋ฐ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ๋ค.
const int MAX = 5000000;
int n, m, k;
vector<int> cards, enemy;
bool ch[MAX];
void solve()
{
cin >> n >> m >> k;
cards = vector<int>(m + 1);
enemy = vector<int>(k + 1);
// ๋ด๊ฐ ๋ค๊ณ ์๋ ์นด๋๋ค
for (int i = 1; i <= m; ++i)
cin >> cards[i];
// ์ ์ด ๋ผ ์นด๋๋ค
for (int i = 1; i <= k; ++i)
cin >> enemy[i];
// ์ด๋ถ ํ์์ ์ํ ์ ๋ ฌ
sort(cards.begin(), cards.end());
for (int i = 1; i <= k; ++i)
{
int left = 1, right = cards.size() - 1, mid;
while (left <= right)
{
mid = (left + right) / 2;
int value = cards[mid];
if (enemy[i] < value)
{
right = mid - 1;
}
else
{
left = mid + 1;
}
}
// ํ๋ฒ๋ ๋ธ์ ์๋ ์นด๋๋ผ๋ฉด
if (ch[right + 1] == false)
{
cout << cards[right + 1] << " ";
ch[right + 1] = true;
}
// ์นด๋๋ฅผ ๋์๋ค๋ฉด
else
{
for (int j = right + 2; j < cards.size(); ++j)
{
if (ch[j] == true)
continue;
// ๋ธ์ ์๋ ์นด๋๊ฐ ๋์ฌ ๋๊น์ง ์ฐพ๋๋ค.
// ๋ฌธ์ ์กฐ๊ฑด์์ ๋ผ ์ ์๋ ๊ฒฝ์ฐ๋ ์๋ค๊ณ ํ์ผ๋ ๋ฌด์กฐ๊ฑด ์์ด์ผํจ.
cout << cards[j] << " ";
ch[j] = true;
break;
}
}
}
}
๐์ ์ฒด ์ฝ๋
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include<iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <math.h>
using namespace std;
// ์นด๋ ๊ฒ์
//
// 10 7 5
// 2 5 3 7 8 4 9
// 4 1 1 3 8
//
// 5 2 3 4 9
//
const int MAX = 5000000;
int n, m, k;
vector<int> cards, enemy;
bool ch[MAX];
void solve()
{
cin >> n >> m >> k;
cards = vector<int>(m + 1);
enemy = vector<int>(k + 1);
for (int i = 1; i <= m; ++i)
cin >> cards[i];
for (int i = 1; i <= k; ++i)
cin >> enemy[i];
sort(cards.begin(), cards.end());
for (int i = 1; i <= k; ++i)
{
int left = 1, right = cards.size() - 1, mid;
while (left <= right)
{
mid = (left + right) / 2;
int value = cards[mid];
if (enemy[i] < value)
{
right = mid - 1;
}
else
{
left = mid + 1;
}
}
if (ch[right + 1] == false)
{
cout << cards[right + 1] << " ";
ch[right + 1] = true;
}
else
{
for (int j = right + 2; j < cards.size(); ++j)
{
if (ch[j] == true)
continue;
cout << cards[j] << " ";
ch[j] = true;
break;
}
}
}
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
freopen("input.txt", "rt", stdin);
solve();
return 0;
}