[BaekJoon 10989][๐ŸŸค1] ์ˆ˜ ์ •๋ ฌํ•˜๊ธฐ 3

Date :   Updated :

โ“ ๋ฌธ์ œ

๋ฐฑ์ค€ 10989 - โ€œ์ˆ˜ ์ •๋ ฌํ•˜๊ธฐ 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