[BaekJoon 2775][๐ŸŸค1] ๋ถ€๋…€ํšŒ์žฅ์ด ๋ ํ…Œ์•ผ

Date :   Updated :

โ“ ๋ฌธ์ œ

๋ฐฑ์ค€ 2775 - โ€œ๋ถ€๋…€ํšŒ์žฅ์ด ๋ ํ…Œ์•ผโ€

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

Bronze ๐ŸŸค1

๐Ÿง  ํ’€์ด

1. ๋‚ด ํ’€์ด (DP + ๋ˆ„์ ํ•ฉ)

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

  • Dynamic Programming

- ์„ค๋ช…

2์ฐจ์› ๋ฐฐ์—ด์„ ์ด์šฉํ•œ DP ํ’€์ด์ด๋‹ค.

๊ฐ ์ธต๊ณผ ๊ฐ ๋ฐฉ๋“ค์„ ํ•˜๋‚˜์˜ ๋ฐฐ์—ด์˜ ์š”์†Œ๋กœ ์ƒ๊ฐํ•ด 2์ฐจ์› ๋ฐฐ์—ด์„ ๋งŒ๋“ค๊ณ , ๋ชจ๋“  ๋ฐฉ๋“ค์˜ ๊ฐ’๋“ค์„ ๋ˆ„์ ํ•ฉ์œผ๋กœ ๊ตฌํ•ด์„œ ๋ฏธ๋ฆฌ ํ…Œ์ด๋ธ”์„ ๋งŒ๋“ค์–ด ๋†“์•˜๋‹ค. ๊ทธ๋ ‡๊ฒŒ ํ•ด์„œ ์ž…๋ ฅ์ด ๋“ค์–ด์˜ฌ ๋•Œ๋งˆ๋‹ค ๋ฐ”๋กœ ๋ฐฐ์—ด์— '์ž„์˜ ์ ‘๊ทผ'์œผ๋กœ ๊ฐ’์„ ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๊ฐ€ ์–ผ๋งˆ๋‚˜ ๋งŽ์ด ๋“ค์–ด์˜ฌ์ง€ ๋ชจ๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ์ด ๋ฐฉ๋ฒ•์ด ๊ฐ€์žฅ ํšจ์œจ์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค.

๋ฏธ๋ฆฌ ํ…Œ์ด๋ธ”์„ ๋งŒ๋“œ๋Š”๋ฐ๋Š” k * n๋ฒˆ์˜ ๋ฃจํ”„๊ฐ€ ํ•„์š”ํ•˜์ง€๋งŒ, ๋‹ต์„ ์ถœ๋ ฅํ•˜๋Š”๋ฐ๋Š” O(1)์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๊ฐ€์ง„๋‹ค.

- ์ฝ”๋“œ

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


using namespace std;

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

    int iT{};
    cin >> iT;

    int arr[15][14]{};

    for(int i = 0; i < 14; ++i)
    {
        arr[0][i] = i + 1;  // 0์ธต ์ฑ„์šฐ๊ธฐ
    }

    // 14 * 14์˜ ๋ชจ๋“  ๋ฐฐ์—ด ๋ฏธ๋ฆฌ ๊ตฌํ•˜๊ธฐ
    for(int i = 1; i < 15; ++i)
    {
        for(int j = 0; j < 14; ++j)
        {
            if(j == 0)
            {
                arr[i][j] = 1;
                continue;
            }

            arr[i][j] = arr[i][j - 1] + arr[i - 1][j];
        }
    }

    while(iT--)
    {
        int iK{}, iN{};
        cin >> iK >> iN;

        cout << arr[iK][iN - 1] << "\n";
    }

    return 0;
}

2. ์ถ”๊ฐ€ ํ’€์ด (์ตœ์ ํ™”๋œ DP)

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

  • Dynamic Programming

- ์„ค๋ช…

1์ฐจ์› ๋ฐฐ์—ด๋งŒ์„ ์‚ฌ์šฉํ•œ DP ๋ฐฉ์‹์ด๋‹ค.

๋‚˜์˜ 2์ฐจ์› ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋น„ํ•ด ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ ˆ๋ฐ˜์œผ๋กœ ์•„๋‚„ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ ๋Œ€์‹  ์ž…๋ ฅ์ด ๋“ค์–ด์˜ฌ ๋•Œ๋งˆ๋‹ค ๋‹ค์‹œ ๊ณ„์‚ฐ์„ ํ•ด์•ผํ•ด์„œ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์˜ ์ˆ˜๊ฐ€ ์ปค์ง€๊ฑฐ๋‚˜, 'k', 'n'์˜ ๊ฐ’์ด ์ปค์งˆ ๊ฒฝ์šฐ ์†๋„๊ฐ€ ํ™• ๋–จ์–ด์งˆ ์ˆ˜ ์žˆ๋‹ค๋Š” ๋‹จ์ ๋„ ์กด์žฌํ•œ๋‹ค.

๋‹จ ํ•œ ๋ฒˆ๋งŒ ๋‹ต์„ ๋‚ด์„œ ์ถœ๋ ฅํ•ด์•ผํ•˜๊ฑฐ๋‚˜ ์กฐ๊ฑด๊ฐ’์ด ํฌ์ง€ ์•Š์€ ๊ฒฝ์šฐ์—๋Š” ์ตœ์ ์˜ ๋ฐฉ๋ฒ•์ด๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

์ž…๋ ฅ์ด ๋“ค์–ด์˜ฌ ๋•Œ๋งˆ๋‹ค ๋‹ค์‹œ ๊ฐ’์„ ๊ณ„์‚ฐํ•ด์•ผ ํ•˜๋ฏ€๋กœ O(k * n)์ด์ง€๋งŒ, ๊ฐ๊ฐ์˜ ๊ฐ’์ด ํฌ์ง€ ์•Š์•„ ๊ฑฐ์˜ O(1)์ด๋ผ๊ณ ๋„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

- ์ฝ”๋“œ

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

#include <vector>


using namespace std;

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

    int iT{};
    cin >> iT;

    while(iT--)
    {
        int iK{}, iN{};
        cin >> iK >> iN;

        vector<int> vecDP(iN + 1, 0);
        for(int i = 0; i <= iN; ++i)
        {
            vecDP[i] = i;   // 0์ธต ์ฑ„์šฐ๊ธฐ
        }

        // ์ธต์„ ์˜ฌ๋ ค๊ฐ€๋ฉฐ ๊ฐ ์ธต์˜ ๋ฐฉ ์ˆœ์„œ์— ๋”ฐ๋ผ DP๋กœ ๊ฐ’ ๊ฐฑ์‹ 
        for(int iFloor = 1; iFloor <= iK; ++iFloor)
        {
            for(int iRoom = 1; iRoom <= iN; ++iRoom)
            {
                vecDP[iRoom] += vecDP[iRoom - 1];
            }
        }

        cout << vecDP[iN] << "\n";
    }
}

๐Ÿ’ญ ํ›„๊ธฐ

DP๋ผ๋Š” ๋™์ผํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•˜๋”๋ผ๋„ ๊ฐ๊ฐ ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅด๊ฒŒ ํ’€ ์ˆ˜ ์žˆ๋Š”์ง€๋ฅผ ์•Œ ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ์ด๋‹ค.

์ฒ˜์Œ์—” ๊ทœ์น™์„ ์ด์šฉํ•œ ์ ํ™”์‹์„ ๋งŒ๋“ค์–ด์„œ ์™„์ „ํ•œ O(1)์˜ ๋ฐฉ๋ฒ•์ด ์—†์„๊นŒ ๊ณ ๋ฏผํ–ˆ์ง€๋งŒ, ์ƒ๊ฐ๋ณด๋‹ค ๋ณต์žกํ•˜๊ณ  DP ๋ฐฉ์‹์ด ๋” ์ง๊ด€์ ์ด๊ณ  ์†๋„๋„ ์ถฉ๋ถ„ํžˆ ๋น ๋ฅด๊ธฐ์— ์œ„์™€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ํ’€๊ฒŒ ๋˜์—ˆ๋‹ค.

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

Comments