[BaekJoon 2798][๐ŸŸค2] ๋ธ”๋ž™์žญ

Date :   Updated :

โ“ ๋ฌธ์ œ

๋ฐฑ์ค€ 2798 - โ€œ๋ธ”๋ž™์žญโ€

๐ŸŽฏ ๋‚œ์ด๋„

Bronze ๐ŸŸค2

๐Ÿง  ํ’€์ด

1. ๋‚ด ํ’€์ด (๋ธŒ๋ฃจํŠธ ํฌ์Šค)

- ์•Œ๊ณ ๋ฆฌ์ฆ˜

  • Brute Force

- ์„ค๋ช…

  • ์‹œ๊ฐ„ ์ œํ•œ 1์ดˆ
  • ๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ 128MB
  • 3 <= N <= 100

์ด๋ผ๋Š” ์กฐ๊ฑด ํ•˜์—์„œ๋Š”, ๋ธŒ๋ฃจํŠธ ํฌ์Šค ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ์ถฉ๋ถ„ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ด์„œ ์‚ผ์ค‘ ๋ฐ˜๋ณต๋ฌธ์œผ๋กœ ๊ฐ„๋‹จํžˆ ํ•ด๊ฒฐํ–ˆ๋‹ค.

์‚ฌ์‹ค์ƒ ์ฝ”๋“œ๋กœ๋งŒ ๋”ฐ์ง€๋งŒ ์™„์ „ํžˆ ๊ฐ„๋žตํ•˜๊ฒŒ ์‚ผ์ค‘ ๋ฐ˜๋ณต๋ฌธ์œผ๋กœ๋งŒ ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๊ฐœ์ธ์ ์œผ๋กœ ์กฐ๊ธˆ์ด๋ผ๋„ ๋” ์ตœ์ ํ™”๋ฅผ ํ•˜๊ณ  ์‹ถ์–ด์„œ ๊ฐ€์ง€์น˜๊ธฐ์šฉ ์ฝ”๋“œ๋ฅผ ๋งŽ์ด ์ถ”๊ฐ€ํ–ˆ๋‹ค.

์‚ผ์ค‘ ๋ฐ˜๋ณต๋ฌธ์˜ ์™„์ „ ํƒ์ƒ‰ ๋ฐฉ์‹์ด๋ฏ€๋กœ O(Nยณ)์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๊ฐ€์ง„๋‹ค.

- ์ฝ”๋“œ

๋‚ด ํ’€์ด ์ฝ”๋“œ
#include <iostream>

#include <vector>

#include <algorithm>


using namespace std;

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int iN{}, iM{};
    cin >> iN >> iM;

    vector<int> vecCard(iN, 0);
    for(int i = 0; i < iN; ++i)
    {
        cin >> vecCard[i];
    }

    sort(vecCard.begin(), vecCard.end());

    int iMax{ 0 };

    for(int i = 0; i < iN - 2; ++i)
    {
        int iSum1{ vecCard[i] };

        // ํ˜„์žฌ ์‹œ์  ์ตœ์†Ÿ๊ฐ’์ด iM๋ณด๋‹ค ํฌ๋ฉด ๋ฐ”๋กœ break;
        if(iSum1 + vecCard[i + 1] + vecCard[i + 2] > iM)
        {
            break;
        }
        // ํ˜„์žฌ ์‹œ์  ์ตœ๋Œ€๊ฐ’์ด iMax๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์œผ๋ฉด ๊ฑด๋„ˆ ๋œ€
        else if(iSum1 + vecCard[iN - 1] + vecCard[iN - 2] <= iMax)
        {
            continue;
        }

        for(int j = i + 1; j < iN - 1; ++j)
        {
            int iSum2{ iSum1 + vecCard[j] };

            // ์ง€๊ธˆ ๊ฐ’์ด iM๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™์œผ๋ฉด ๋ฐ”๋กœ break;
            if(iSum2 >= iM)
            {
                break;
            }
            // ํ˜„์žฌ ์‹œ์  ์ตœ๋Œ€๊ฐ’์ด iMax๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์œผ๋ฉด ๊ฑด๋„ˆ ๋œ€
            else if(iSum2 + vecCard[iN - 1] <= iMax)
            {
                continue;
            }

            for(int k = j + 1; k < iN; ++k)
            {
                int iSum3{ iSum2 + vecCard[k] };

                // ์›ํ•˜๋Š” ๊ฐ’ ์ฐพ์œผ๋ฉด ๋ฐ”๋กœ ์ถœ๋ ฅ ํ›„ ์ข…๋ฃŒ
                if(iSum3 == iM)
                {
                    cout << iM;
                    return 0;
                }
                // ์ตœ์ข…๊ฐ’์ด iM๋ณด๋‹ค ํฌ๋ฉด break;
                else if(iSum3 > iM)
                {
                    break;
                }

                // ์กฐ๊ฑด ๋งŒ์กฑ์‹œ iMax ๊ฐ’ ๊ฐฑ์‹ 
                iMax = iMax < iSum3 ? iSum3 : iMax;
            }
        }
    }

    cout << iMax;

    return 0;
}

2. ์ถ”๊ฐ€ ํ’€์ด (ํˆฌ ํฌ์ธํ„ฐ)

- ์•Œ๊ณ ๋ฆฌ์ฆ˜

  • Two Pointer

- ์„ค๋ช…

๋‚ด ํ’€์ด๊ฐ€ ์•„๋งˆ ๋ฌธ์ œ์—์„œ ์˜๋„ํ•œ ์ •์„์— ๊ฐ€๊น๋‹ค๊ณ ๋Š” ์ƒ๊ฐํ•˜์ง€๋งŒ, ๊ทธ๋ž˜๋„ ์ด ํ’€์ด๊ฐ€ ๋” ์ข‹์•„ ๋ณด์—ฌ์„œ ๊ฐ€์ ธ์™”๋‹ค.

ํˆฌ ํฌ์ธํ„ฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•ด์„œ ๋ฐ˜๋ณต๋ฌธ์„ ์„ธ ๋ฒˆ ์ค‘์ฒฉ์—์„œ ๋‘ ๋ฒˆ ์ค‘์ฒฉ์œผ๋กœ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค. ์†๋„ ์ƒ์œผ๋กœ ๊ฝค๋‚˜ ํฐ ์ด๋“์ด๊ธฐ ๋•Œ๋ฌธ์—, ์“ฐ๋ฉด ์•ˆ๋  ์ด์œ ๊ฐ€ ์—†๋‹ค. ๋ฌผ๋ก  ํˆฌ ํฌ์ธํ„ฐ๋ฅผ ์“ฐ๊ธฐ ์œ„ํ•ด ์ •๋ ฌ์„ ํ•ด์•ผํ•˜์ง€๋งŒ, ์ด๋Š” sort๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ถ€๋‹ด ์—†์ด ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

ํˆฌ ํฌ์ธํ„ฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ๋ฐ˜๋ณต๋ฌธ ์ค‘์ฒฉ์„ ํ•œ ๋ฒˆ ์ค„์—ฌ์„œ ์‹œ๊ฐ„ ๋ณต์žก๋„๊ฐ€ O(Nยฒ)์ด๋‹ค.

- ์ฝ”๋“œ

์ถ”๊ฐ€ ํ’€์ด ์ฝ”๋“œ
#include <iostream>

#include <vector>

#include <algorithm>


using namespace std;

int main() 
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int iN{}, iM{};
    cin >> N >> M;

    vector<int> vecCard(iN);

    for(int& iCard : vecCard)
    {
        cin >> iCard
    }

    // ํˆฌ ํฌ์ธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์ •๋ ฌ ํ•„์ˆ˜
    sort(vecCard.begin(), vecCard.end());

    int iMax{};
    for (int i = 0; i < iN - 2; ++i) 
    {
        int iLeft{ i + 1}, iRight{ N - 1 };

        while (iLeft < iRight) 
        {
            int iSum = vecCard[i] + vecCard[iLeft] + vecCard[iRight];

            if (iSum == iM) 
            { 
                cout << iM; 
                return 0; 
            }
            // ํ•ฉ์ด iM๋ณด๋‹ค ์ž‘์œผ๋ฉด iMax ๊ฐฑ์‹ ํ•˜๊ณ  ++iLeft๋กœ ๋ฒ”์œ„ ์ถ•์†Œ
            if (iSum < iM) 
            { 
                iMax = max(iMax, iSum); 
                ++iLeft; 
            }
            // ํ•ฉ์ด iM ๋ณด๋‹ค ์ž‘์„ ๊ฒฝ์šฐ --iRight๋กœ ๋ฒ”์œ„ ์ถ•์†Œ
            else 
            { 
                --iRight; 
            }
        }
    }

    cout << iMax;
}

๐Ÿ’ญ ํ›„๊ธฐ

๋‚˜๋Š” ๋ธŒ๋ฃจํŠธ ํฌ์Šค๋ฅผ ์“ฐ๊ณ  ์ตœ์ ํ™”๋ฅผ ์œ„ํ•ด ๋งŽ์€ ๊ฐ€์ง€์น˜๊ธฐ์šฉ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ–ˆ์ง€๋งŒ, ํˆฌ ํฌ์ธํ„ฐ๋งŒ์œผ๋กœ๋„ ๊ฐ„๋‹จํžˆ ๋” ๋น ๋ฅธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜๋‹ค.

๊ฐ„๋‹จํžˆ ํ’€๋ ค๋„ ์ข€ ๋” ๋‚˜์€ ํ’€์ด ๋ฐฉ๋ฒ•์€ ์—†์„์ง€ ๊ณ ๋ฏผํ•ด๋ณด๋Š” ์‹œ๊ฐ„์„ ๊ฐ€์ง€๋Š”๊ฒŒ ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค.

๐Ÿ”— ์ฐธ๊ณ ์ž๋ฃŒ

Comments