Tiling 2xn
ํ๋ฆฐ ์ด์
์ผ๋จ Top-down ์ฌ๊ท ๋ฐฉ์์ผ๋ก ํ ๊ฑด์ง, Bottom-Up ๋ฐ๋ณต๋ฌธ์ผ๋ก ํ ๊ฑด์ง ๊ฒฐ์ ํด์ผ ํ๋ค.
์ ๋ต์ %10007๋ก ๋๋ ์ผํ๋๋ฐ ๋๋์ง ์์์ ํ๋ ธ๋ค. ๊ทธ๋์ ์ต์ข ํด์ธ go(N)๋ฆฌํด๊ฐ๋ง %10007๋ก ๋ฐ๊พธ๋ ๋ ํ๋ ธ๋ค. dp[N] = go(N-1) + go(N-2);์ด๋ค. ์ด ๋ํด์ง๋ ๋๊ฐ์ ๊ฐ์ ๋ชจ๋ %10007ํด์ฃผ๋๊น ์ ๋ต์ฒ๋ฆฌ๋๋ค. =>๋๋ฌด ์ฌํ ํฌ์์ ๊ฐ๋ค ๋ค ๋ํ๊ณ ๋ ํ /2 ํ ๊ฐ != /2 ๋จผ์ ํ๊ณ ๋ค ๋ํ ๊ฐ ๋ค๋ฅด๋ฏ์ด, ์ฌ๊ธฐ์๋ ๋น์ทํ ์ด์น ์๋๊น ์ง์ํ๋ค..
Top-down์ ๋ฌธ์ ๋ฅผ ๊ฐ์ฅ ์์ ๋ฌธ์ ๋ก ์ชผ๊ฐ๊ณ , ๊ทธ ํด๋ฅผ dp๋ฐฐ์ด์ ์ ์ฅํด์ผํ๋ค. ๊ฐ์ฅ ์์ ํด๋ dp[0]๊ณผ dp[1]์ด๋ผ๊ณ ํ ์ ์๋ค. dp[1] = 1์ด๊ณ , dp[2] = 2์ด๋ค. dp[0]์ ํ๋๋ ๋์ง ์๋ ๋ฐฉ๋ฒ์ 1๊ฐ์ง๋ก ์ณ์ 1์ด๋ผ๊ณ ํ๋ค. ๋ฐ๋ผ์ ์๋ ์ฝ๋์์ ์ฌ๊ทํจ์์ ์ฌ๊ทํจ์๋ฅผ ์ข ๋ฃํ๋ ๋ฆฌํดํ๋ ์กฐ๊ฑด์ N์ด 0์ดํ์ผ ๋ 0์ ๋ฆฌํดํ๋ ๊ฒ์ด ์๋๋ผ N์ด 0์ผ ๋, N์ด 1์ผ ๋ dp[0] = 1, dp[1] = 1 ์ ์ฅํด ๋๊ณ , ์ดํ์ dp[N]์ด 0๋ณด๋ค ํฐ ๊ฐ์ด ๋ค์ด์๋ค๋ฉด ์ด๊ฒ์ ์์ ๋ฌธ์ ๋ค๋ก๋ถํฐ ํด๋ฅผ ๊ตฌํด์ ์ ์ฅํ๋ค๋ ์๋ฏธ์ด๋ฏ๋ก dp[N]์ ๋ฐ๋ก ๋ฆฌํดํ๋ฉด ๋๋ค. ์๋์ ์ ๋ต์ฝ๋๋ฅผ ์ฐธ์กฐํ์.
static int go(int N) {
if(N<=0) return 0;
if(dp[N]>0) return 0;//์ด๋ฏธ ์ฑ์์ง ๊ฒฝ์ฐ
//dp[N] = dp[N-1] + dp[N-2];
dp[N] = go(N-1) + go(N-2);
return dp[N];
}
์ ๋ต ์ฝ๋ : N=0,N=1์ผ ๋, dp๋ฐฐ์ด์ ๊ฐ์ ์ ์ฅํ๊ณ , ์ ์ฅํ๊ณ ๋ ํ dp[N]์ ๋ฆฌํดํ๋ค! ์ด๋ก์จ dp[2]๊ฐ ๊ตฌํด์ง๊ณ , ์ฌ๊ทํจ์๋ค์ด ๋ฆฌํด๋๋ฉด์ ์ต์ข ์ ์ผ๋ก ํฐ ๋ฌธ์ ์ ํด๋ ๊ตฌํ ์ ์๊ฒ ๋๋ค!
package ss;
import java.util.Scanner;
public class Tiling_2N {
static int dp[];
static int go(int N) {
if(N==0) dp[N]=1;
else if(N==1) dp[N]=1;
if(dp[N]>0) return dp[N];//์ด๋ฏธ ์ฑ์์ง ๊ฒฝ์ฐ
dp[N] = go(N-1)%10007 + go(N-2)%10007;
return dp[N];
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
dp = new int[1001];
System.out.println(go(N)%10007);
}
}

Last updated
Was this helpful?