"(๋ฐฑ์ค/ C++) 1010 - ๋ค๋ฆฌ ๋๊ธฐ / ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ, ์ฌ๊ท"
https://www.acmicpc.net/problem/1010
N์ ๋๋ ค๋ณด๋ฉด์ ๋น๊ต๋ฅผ ํด๋ณด๋ ๊ท์น์ ์ฝ๊ฒ ๋ฐ๊ฒฌ ํ ์ ์์๋ค.
N(๊ฐ ์์ชฝ)์ ๋งจ ์ ๋ค๋ฆฌ๊ฐ M(๊ฐ ๋์ชฝ)์ ์์นํ ์ ์๋ ์กฐ๊ฑด์ N์ ๋น ์ง ์์ด ๋ชจ๋ ์ฐ๊ฒฐ์ ๋์ผ ํ๋ฏ๋ก M - N + 1์ด ๋๋ค.
DP [ N ][ M ] ์ด๋ผ๊ณ ๋ง๋ค ๋, ์๋ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ๊ท์ง์ ์ฐพ์ ์ ์๋๋ฐ N์ด 1์ผ๋๋ M์ ๊ฐ์ ๋งํผ ๊ฒฝ์ฐ์ ์๊ฐ ์๊ธด๋ค. ์ด ์กฐ๊ฑด์ ํจ์์ return(๋ฐํ) ์กฐ๊ฑด์ผ๋ก ์ฌ์ฉํ๋ฉด ๋๋ค.
๋ N๊ณผ M์ด ๊ฐ์ ๋๋ ๋ชจ๋ ๋ค๋ฆฌ๋ฅผ ์ฐ๊ฒฐ ํ๋ฏ๋ก ์ธ์ ๋ ํ๋์ ๊ฒฝ์ฐ์ ์์ด๋ค. ์ด๊ฑฐ ๋ํ ํจ์์ return(๋ฐํ)์กฐ๊ฑด์ผ๋ก ์ฌ์ฉํ๋ค.
N(๊ฐ ์์ชฝ)์ ๋งจ ์ ๋ค๋ฆฌ๋ฅผ M(๊ฐ ๋์ชฝ)์ ์๋ ๋ค๋ฆฌ ์์์ ๋ถํฐ 1์ด๋ผ๊ณ ํ์ ๋ M - N + 1 ๋ฒ์งธ ๊น์ง ์๋ฌด๋๋ ๊ทธ์ด ๋ณด์. ๊ทธ๋ฆผ์ ๋ณด๋ฉด ์์ง๋ง N(๊ฐ ์์ชฝ)์ ๋งจ ์ ๋ค๋ฆฌ๊ฐ M์ ์ด๋ค ์์น์ ์๋์ ๋ฐ๋ผ ๊ฒฝ์ฐ์ ์๊ฐ ๋ณํ๋๋ค.
๋ฌธ์ ์ ์ด๋ฌํ ๊ท์น์ด ์๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฅํ๋ค.
๊ทธ๋ผ ์ด๋ ๊ฒ ํด์ N(๊ฐ ์์ชฝ) : 3๊ฐ์ ์ฌ์ดํธ M(๊ฐ ๋์ชฝ) : 5๊ฐ์ ์ฌ์ดํธ๊ฐ ์๋ค๊ณ ๊ฐ์ ํ ๋ ๋ค๋ฆฌ๋ผ๋ฆฌ ์๋ก ๊ฒน์ณ์ง์ง ์๊ณ ๋ค๋ฆฌ๋ฅผ ์ง์ ์ ์๋ ๊ฒฝ์ฐ์ ์๋ < DP [ 3 ][ 5 ] = DP [ 2 ][ 4 ] + DP [ 2 ][ 3 ] + DP [ 2 ][ 2 ] >์ด๋ค.
// -----------------------------
// [ ๋ค๋ฆฌ ๋๊ธฐ ] ----------------
// -----------------------------
#include<iostream>
using namespace std;
int dp[30][30] = {0, };
int BridgeFunc(int N, int M)
{
if (dp[N][M])
return dp[N][M];
if(N == M)
return dp[N][M] = 1;
if (N == 1)
return dp[N][M] = M;
for (int i = 1; i <= M-N+1 ; ++i)
{
dp[N][M] += BridgeFunc(N - 1, M - i);
}
return dp[N][M];
}
int main(void)
{
int mTC;
cin >> mTC;
while (mTC--)
{
int N, M; // 0 < N <= M < 30
cin >> N >> M;
cout << BridgeFunc(N, M) <<endl;
}
return 0;
}
+ ๋ค๋ฅธ ๋ถ๋ค ํ์ด๋ฅผ ๋ณด๋ ์กฐํฉ์ผ๋ก ํ๊ณ ์์๋ค.
N(๊ฐ ์์ชฝ) : 3๊ฐ์ ์ฌ์ดํธ M(๊ฐ ๋์ชฝ) : 5๊ฐ์ ์ฌ์ดํธ๊ฐ ์๋ค๊ณ ๊ฐ์ ํ ๋
์ด๊ฑธ 5๊ฐ ์ค 3๊ฐ๋ฅผ ๊ณ ๋ฅด๋ ์กฐํฉ์ด๋ผ๋ ๊ฒ์ด๋ค .. ๊ทธ๊ฒ ๋ ์ฝ๋ค...ํํ
์กฐํฉ, ์์ด ๊ณต์๋ง ํ ๋ฒ ๋ ๋ณด๊ณ ๋์ด๊ฐ๋๋ก ํ์
'๐ coding test > โฝ ๋ฐฑ์ค' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์ ํ๋ ๊ฒ ๋ณด๋ค ๋ซ๊ฒ ์ง
ํฌ์คํ ์ด ์ข์๋ค๋ฉด "์ข์์โค๏ธ" ๋๋ "๊ตฌ๋ ๐๐ป" ํด์ฃผ์ธ์!