-๋™์ ๊ณ„ํš๋ฒ• (dynamic programming)

๋ณต์žกํ•œ ๋ฌธ์ œ๋ฅผ ๊ฐ„๋‹จํ•œ ์—ฌ๋Ÿฌ๊ฐœ์˜ ๋ฌธ์ œ๋กœ ๋‚˜๋ˆ„์–ด์„œ ํ‘ธ๋Š” ๋ฐฉ๋ฒ•.

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

 

๋ฌธ์ œ๋ฅผ ์—ฌ๋Ÿฌ๊ฐœ์˜ ํ•˜์œ„ ๋ฌธ์ œ(subproblem)๋กœ ๋‚˜๋ˆ„์–ด ํ’ˆ.

์ด ํ•˜์œ„๋ฌธ์ œ๋“ค์„ ๊ฒฐํ•ฉํ•˜์—ฌ ์ตœ์ข…์ ์ธ ๋ฌธ์ œ์— ๋„๋‹ฌํ•˜๋Š” ๊ฒƒ.

 

๋ฉ”๋ชจ์ด์ œ์ด์…˜(memoization)

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

๋™์  ๊ณ„ํš๋ฒ•์˜ ํ•ต์‹ฌ ๊ธฐ์ˆ .

 

์ฒ˜์Œ ๋ฐฉ๋ฌธํ•˜๋Š” ์žฌ๊ท€๋ฌธ์ œ๋ฉด ๊ณ„์‚ฐ์„ ํ†ตํ•ด ์–ป์€ ๊ฐ’์„ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ,

์ด ํ›„ ์žฌ๋ฐฉ๋ฌธ์„ ํ•˜๋ฉด ๊ณ„์‚ฐํ•˜์ง€ ์•Š๊ณ  ์ €์žฅ ๋œ ๊ฐ’ ์‚ฌ์šฉ.



ex)

import java.util.Scanner;

public class Main {
	static int array[][][] = new int[51][51][51];
	
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		int a=0, b=0, c=0;
		while(true){
			a = scan.nextInt();
			b = scan.nextInt();
			c = scan.nextInt();
			if(a==-1 && b==-1 && c==-1) break;
			System.out.printf("w(%d, %d, %d) = %d\n",a,b,c,w(a,b,c));
			
		}

	}
	
	static int w(int a, int b, int c) {
		if(a<=0 || b<=0 || c<=0)
			return 1;
		else if(array[a][b][c] != 0)
			return array[a][b][c];
		else if(a>20 || b>20 || c>20)
			return array[a][b][c] = w(20,20,20);
		else if(a<b && b<c)
			return array[a][b][c] = w(a,b, c-1) + w(a, b-1, c-1) - w(a, b-1, c);
		else
			return array[a][b][c] = w(a-1, b, c) + w(a-1, b-1, c) + w(a-1, b, c-1) - w(a-1, b-1, c-1);
	}

}

 

์ด์ „์— ๊ณ„์‚ฐํ•œ ๊ฐ’๋“ค์„ ๋ฐฐ์—ด์—๋‹ค ์ €์žฅ์‹œํ‚ค๊ณ , ์ด์ „์— ๊ณ„์‚ฐํ•œ๊ฐ’์ด ์žˆ์œผ๋ฉด ๊ณ„์‚ฐ์„ ํ•˜์ง€์•Š๊ณ  ๋ฐ”๋กœ ์ €์žฅ๋œ ๊ฐ’์„ returnํ•˜์—ฌ ํ”„๋กœ๊ทธ๋žจ ์†๋„ ๊ฐœ์„ ์„ ํ•  ์ˆ˜ ์žˆ์Œ.

728x90
๋ฐ˜์‘ํ˜•
Liky