[BaekJoon 10989][๐ค1] ์ ์ ๋ ฌํ๊ธฐ 3
โ ๋ฌธ์
๐ฏ ๋์ด๋
Bronze ๐ค1
๐ง ํ์ด
1. ๋ด ํ์ด (์ ๋ ฌ)
- ์๊ณ ๋ฆฌ์ฆ
Sorting
- ์ค๋ช
์
๋ ฅ๋ฐ์ ์๋ฅผ ์นด์ดํ
ํ๋ ๋ฐฉ์์ผ๋ก ์ ๋ ฌํ๋ ํ์ด์ด๋ค.
์ฒ์์๋ ์๊ฐ ์ ํ 5์ด๋ง ์๊ฐํ๊ณ , ๊ทธ๋ฅ vector์ ๋๋ ค๋ฃ๊ณ sortํ๋ฉด ๋ ์๋๊ฐ? ๋ผ๊ณ ์๊ฐํ๋ค.
ํ์ง๋ง ๋ฉ๋ชจ๋ฆฌ ์ ํ '8Mb'๋ฅผ ๋ณด๊ณ , ๊ทธ๋ ๊ฒ ๊ฐ๋จํ๊ฒ๋ ํ ์ ์๋ค๋ ๊ฑธ ๊นจ๋ซ๊ณ ์ด ํ์ด๋ฅผ ์๊ฐํด๋๋ค.
๋ฉ๋ชจ๋ฆฌ ์ ํ 8Mb๋ผ๋๊ฑด, int ์๋ฃํ์ ์ผ์ ๋ 200๋ง๊ฐ์ ์
๋ ฅ์ ๋ฐ์ ์ ์๋ค๋ ๋ป์ด๊ณ , ์ด๋ 1 โค N โค 10,000,000 ์กฐ๊ฑด์ ๋นํ๋ฉด ํ์ฐธ ๋ชจ์๋ฅด๋ค.
๋ฐ๋ผ์ ๋ฐฐ์ด๋ก ๋ฏธ๋ฆฌ 10,000๊ฐ์ ์ธ์๋ฅผ ๋ฐ์ ์ ์๊ฒ๋ ๋ง๋ค๊ณ , ๊ฐ ์
๋ ฅ์ด ๋ค์ด์ฌ ๋๋ง๋ค ํด๋น ๋ฐฐ์ด์ ์ซ์๋ฅผ 1์ฉ ์ฌ๋ฆฌ๋ ๋ฐฉ์์ผ๋ก ์ ๋ ฌํ๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๋ง์ง๋ง์ ๊ฐ ๋ฐฐ์ด์ ์ซ์๋งํผ ์ถ๋ ฅ์ ๋ฐ๋ณตํด์ฃผ๊ธฐ๋ง ํ๋ฉด ๋๋๋ค.
์
๋ ฅ๊ณผ ์ถ๋ ฅ ๋ชจ๋ O(N) ์๊ฐ ๋ณต์ก๋ ์ด๋ฏ๋ก, ์ต์ข
์ ์ผ๋ก ์๊ฐ ๋ณต์ก๋๊ฐ O(N)์ด๋ผ๊ณ ๋ณผ ์ ์๋ค.
- ์ฝ๋
๋ด ํ์ด ์ฝ๋
#include <iostream>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
int iN{};
cin >> iN;
int arrNumber[10001]{};
while(iN--)
{
int iInput{};
cin >> iInput;
// ๋ค์ด์จ ์ซ์ ์นด์ดํธ
++arrNumber[iInput];
}
for(int i = 0; i <= 10000; ++i)
{
for(int j = 0; j < arrNumber[i]; ++j)
{
// ์ซ์๋ง๋ค ์นด์ดํธ ๋ ๋งํผ ์ถ๋ ฅ
cout << i << "\n";
}
}
return 0;
}
2. ์ถ๊ฐ ํ์ด (์ถ๋ ฅ ์ต์ ํ)
- ์๊ณ ๋ฆฌ์ฆ
Sorting
- ์ค๋ช
๋ด ํ์ด์์ string์ ์ด์ฉํ ์ถ๋ ฅ ์ต์ ํ๋ฅผ ํ๋ ๋ฐฉ์์ด๋ค.
์ ๋ ฌ์ ๋์ ์๋ ํ์ด๋๋ก ํ๋ฉด ๋์ง๋ง, ๋ชจ๋ ์ซ์๋ฅผ ๋ฐ๋ณต๋ฌธ๋ง๋ค ๊ณ์ํด์ cout์ ํตํด ์ถ๋ ฅํ๋ฏ๋ก, N์ด ์ปค์ง๋ฉด ์ถ๋ ฅ ์ค๋ฒํค๋๊ฐ ์ฌํด์ง๋ค.
๋ฐ๋ผ์ ๋ฏธ๋ฆฌ capacity๋ฅผ ํ ๋นํ string์ ์ถ๋ ฅ์ ๋ํ๊ณ , ์ผ์ size๊ฐ ๋๊ธฐ ์ ์ ์ถ๋ ฅํ๊ณ ๋ค์ ๋ฒํผ๋ฅผ ๋น์์ฃผ๋ ์์ผ๋ก ์ถ๋ ฅํ๋ฉด, cout ์์ฒด์ '๋ฒํผ๋ง'๊ณผ ์ถ๋ ฅ ์ฐ์ฐ์ (<<)์ ํธ์ถ '์ค๋ฒํค๋'๋ฅผ ์๋นํ ์ค์ผ ์ ์๋ค.
์ด ๋ฐฉ๋ฒ๋ ์ถ๋ ฅ ์ต์ ํ๋ง ํ ๊ฒ์ด์ง ์๊ณ ๋ฆฌ์ฆ ์์ฒด๋ ๋ฐ๋์ง ์์ผ๋ฏ๋ก ์๊ฐ ๋ณต์ก๋๋ ์ฌ์ ํ O(N)์ด๋ค.
- ์ฝ๋
๋ด ํ์ด ์ฝ๋
#include <iostream>
#include <string>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
int iN{};
cin >> iN;
int arrNumber[10001]{};
while(iN--)
{
int iInput{};
cin >> iInput;
// ๋ค์ด์จ ์ซ์ ์นด์ดํธ
++arrNumber[iInput];
}
// 1 << 20 ์ ๋๋ต 1Mb
const size_t FLUSH_LIMIT = 1 << 20;
string strOutput{};
strOutput.reserve(FLUSH_LIMIT * 2);
for(int i = 0; i <= 10000; ++i)
{
for(int j = 0; j < arrNumber[i]; ++j)
{
strOutput += to_string(i);
strOutput += '\n';
// FLUSH_LIMIT ๋๊ธฐ๋ฉด ์ถ๋ ฅํ๊ณ ๋ฒํผ ๋น์ฐ๊ธฐ (์ฌํ ๋น ๋ฐฉ์ง, ์ถ๋ ฅ ๋ฉ์ด๋ฆฌ ํฌ๊ธฐ ์ ํ)
if(strOutput.size() > FLUSH_LIMIT)
{
cout << strOutput;
strOutput.clear();
}
}
}
cout << strOutput;
return 0;
}
๐ญ ํ๊ธฐ
๋ฐฐ์ด ์ ์ ๋ฉ๋ชจ๋ฆฌ ์ ํ์ ์ํ ์๊ณ ๋ฆฌ์ฆ ์ ํ๊ณผ, ์ถ๋ ฅ์ ์ต์ ํ์ด๋ค.
์ด ๋ฌธ์ ์ฒ๋ผ ํ ์คํธ ์ผ์ด์ค ์๊ฐ ํฌ๊ณ ๋ฉ๋ชจ๋ฆฌ ์ ํ์ด ๋นก๋นกํ ๊ฒฝ์ฐ๋ ์ด๋ฌํ ์นด์ดํ ๋ฐฉ์์ ์ ๋ ฌ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค.
๋ํ ์ถ๋ ฅ์ด ๋๋ฌด ๋ง์ ๊ฒฝ์ฐ๋ string์ ์ฌ์ฉํ ๋ฉ์ด๋ฆฌ๋ก ์ถ๋ ฅํ๋ ๋ฐฉ์์ ์ฌ์ฉํ๋ฉด ์๊ฐ๋ ์๋นํ ๋จ์ถ์ํฌ ์ ์๋ค. ์ด๋ฅผ ๋น์ ํ์๋ฉด ๋ค์๊ณผ ๊ฐ์ด ํํํ ์ ์๋ค.
๋ฌธ ํ ๋ฒ ์ด๋๋ง๋ค ํ๋ฐฐ ํ๋์ฉ ๋ฐฐ๋ฌ 1000ํ vs ๋ฌธ ํ ๋ฒ ์ด๊ณ ํ๋ฐฐ 1000๊ฐ ํ ๋ฒ์ ๋ฐฐ๋ฌ
๋น์ฐํ ํ์๊ฐ ๋น ๋ฅด๋ค. cout <<์ ํตํ ์ถ๋ ฅ์ ์๊ฐ๋ณด๋ค ํธ์ถ ์ค๋ฒํค๋๊ฐ ํฌ๋ค๋ ๊ฒ์ ๊ผญ ๊ธฐ์ตํ์.
Comments