Tiling 2xn

ํ‹€๋ฆฐ ์ด์œ 

  1. ์ผ๋‹จ Top-down ์žฌ๊ท€ ๋ฐฉ์‹์œผ๋กœ ํ’€ ๊ฑด์ง€, Bottom-Up ๋ฐ˜๋ณต๋ฌธ์œผ๋กœ ํ’€ ๊ฑด์ง€ ๊ฒฐ์ •ํ•ด์•ผ ํ•œ๋‹ค.

  2. ์ •๋‹ต์„ %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?