728x90
https://www.acmicpc.net/problem/9184
9184๋ฒ: ์ ๋๋ ํจ์ ์คํ
์ ๋ ฅ์ ์ธ ์ ์ a, b, c๋ก ์ด๋ฃจ์ด์ ธ ์์ผ๋ฉฐ, ํ ์ค์ ํ๋์ฉ ์ฃผ์ด์ง๋ค. ์ ๋ ฅ์ ๋ง์ง๋ง์ -1 -1 -1๋ก ๋ํ๋ด๋ฉฐ, ์ธ ์ ์๊ฐ ๋ชจ๋ -1์ธ ๊ฒฝ์ฐ๋ ์ ๋ ฅ์ ๋ง์ง๋ง์ ์ ์ธํ๋ฉด ์๋ค.
www.acmicpc.net
์๊ณ ๋ฆฌ์ฆ [์ ๊ทผ ๋ฐฉ๋ฒ]
static int w(int a, int b, int c) {
if(a <= 0 || b <= 0 || c <= 0) {
return 1;
}
if(a > 20 || b > 20 || c > 20) {
return w(20, 20, 20);
}
if(a < b && b < c) {
return w(a, b, c - 1) + w(a, b - 1, c - 1) - w(a, b - 1, c);
}
return w(a - 1, b, c) + w(a - 1, b - 1, c) + w(a - 1, b, c - 1) - w(a - 1, b - 1, c - 1);
}
์ด๋ ๊ฒ wํจ์๊ฐ ์ฃผ์ด์ก๊ธฐ ๋๋ฌธ์ ๊ตฌํ์ ๋ฐ๋กํ ํ์๊ฐ ์๋ค.
์ด ๋ถ๋ถ์ ๋์ ๊ณํ๋ฒ์ผ๋ก ํ์ด๋๊ฐ๊ธฐ ์ํด์๋ ์ฒ์ ๋ฐฉ๋ฌธํ๋ ์ฌ๊ท๋ผ๋ฉด ๊ณ์ฐ์ ํตํด ์ป์ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํ๊ณ , ๊ทธ ํ ์ฌ๋ฐฉ๋ฌธ์ ํ ๊ฒฝ์ฐ ๋ค์ ๊ณ์ฐํ๋ ๊ฒ์ด ์๋ ์ ์ฅ๋ ๊ฐ์ ์ฌ์ฉํ๋ผ๋ ๊ฒ์ด๋ค.
์ด ๋ฌธ์ ์์๋ a,b,c๋ผ๋ ๋ณ์๊ฐ ์์ฉํ๋ ๋งํผ 3์ฐจ์ ๋ฐฐ์ด์ ์ด์ฉํ์ฌ ํ์ดํ๋ฉด ๋๋ค.
static int dp[][][]; // ์ด๋ฏธ ๋ฐฐ์ด์ด ์์ฑ๋์๋ค๊ณ ๊ฐ์
static int w(int a, int b, int c) {
// ์ด๋ฏธ ๊ณ์ฐ๋์ด ์ ์ฅ๋์ด์๋ ๊ฒฝ์ฐ ํด๋น ๊ฐ์ ๋ฐ๋ก ๋ฐํ
if(dp[a][b][c] != 0) {
return dp[a][b][c];
}
if(a <= 0 || b <= 0 || c <= 0) {
return 1;
}
/*
* a, b, c์ค ํ๋๋ผ๋ 20์ด ๋์ด๊ฐ๋ฉด w(20, 20, 20)์ ํธ์ถํ๊ธฐ ๋๋ฌธ์
* dp[20][20][20] ์ ์ ์ฅํ๊ณ ๋ฐํํ๋ฉด ๋๋ค.
*/
if(a > 20 || b > 20 || c > 20) {
return dp[20][20][20] = w(20, 20, 20);
}
if(a < b && b < c) {
return dp[a][b][c] = w(a, b, c - 1) + w(a, b - 1, c - 1) - w(a, b - 1, c);
}
return w(a - 1, b, c) + w(a - 1, b - 1, c) + w(a - 1, b, c - 1) - w(a - 1, b - 1, c - 1);
}
๋๋ต์ ์ผ๋ก ์ด๋ ๊ฒ dp๋ฐฐ์ด์ ์ ์ฅํด๋๋ ๊ฒ๊ณผ ์ด๋ฏธ ์ ์ฅ๋ ๊ฒฝ์ฐ๋ง ์ถ๊ฐํด์ฃผ๋ฉด ๋๋ถ๋ถ ์์ฑ์ด ๋๋ค.
ํ์ด ๋ฐ ์ฝ๋
import java.util.Scanner;
public class Main {
/*
* ํจ์ w์์ a, b, c ์ค 20์ด ๋์ด๊ฐ๊ฒ ๋๋ฉด w(20, 20, 20)์ ํธ์ถํ๊ณ ,
* 0 ์ดํ์ผ ๊ฒฝ์ฐ๋ 1์ ๋ฐํํ๊ธฐ ๋๋ฌธ์
* ๊ฐ ๋ฐฐ์ด์ ํฌ๊ธฐ๊ฐ 21 (0~20)์ ๋๊ธฐ์ง ์๋๋ค.
*/
static int[][][] dp = new int[21][21][21];
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
while(true) {
int a = in.nextInt();
int b = in.nextInt();
int c = in.nextInt();
// -1 -1 -1 ์ด ๋์ค๋ฉด ์ข
๋ฃ
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) {
// a, b, c๊ฐ ๋ฒ์๋ฅผ ๋ฒ์ด๋์ง ์์ผ๋ฉด์ ๋ฉ๋ชจ์ด์ ์ด์
์ด ๋์ด์๋ ๊ฒฝ์ฐ
if(inRange(a, b, c) && dp[a][b][c] != 0) {
return dp[a][b][c];
}
if(a <= 0 || b <= 0 || c <= 0) {
return 1;
}
if(a > 20 || b > 20 || c > 20) {
return dp[20][20][20] = w(20, 20, 20);
}
if(a < b && b < c) {
return dp[a][b][c] = w(a, b, c - 1) + w(a, b - 1, c - 1) - w(a, b - 1, c);
}
return dp[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);
}
/*
* ๋ฐฐ์ด์ ์ฐธ์กฐํ๋ ค ํ ๋ a, b, c ์ค ํ๋๋ผ๋ ๋ฒ์ ๋ฐ์ ์๊ฐ
* ๋์ฌ ์ ์๊ธฐ ๋๋ฌธ์ ์ด๋ฅผ ์ฒดํฌ๋ฅผ ํด์ฃผ๊ธฐ ์ํ ํจ์๋ค.
*/
static boolean inRange(int a, int b, int c) {
return 0 <= a && a <= 20 && 0 <= b && b <= 20 && 0 <= c && c <= 20;
}
}
๋ฌธ์ ์กฐ๊ฑด์ ์ ์ฝ์ด๋ณด๋ฉด ์ธ ๋ณ์ ์ค ํ๋๋ผ๋ 0์ดํ์ผ ๊ฒฝ์ฐ๋ 1, 20์ ์ด๊ด ๊ฒฝ์ฐ์๋ w(20,20,20)์ ํธ์ถํ๋ค. ๊ฒฐ๊ณผ์ ์ผ๋ก ์ค์ ์ฐ์ด๋ ๋ฒ์๋ 0~20๊น์ง ๋ฐ์ ์๋๋ค. ํ๋ง๋๋ก dp[a][b][c]์ ๋ํ์ฌ ๊ฐ ์ฐจ์์ ๋ํด 21๊ฐ(0~20)์ ๊ณต๊ฐ๋ง ์์ฑํด์ค ๋ค ๋ฉ๋ชจ์ด์ ์ด์ ์ ํด์ฃผ๋ฉด๋๋ค.
๋์ ์ ํ๊ฐ์ง ์กฐ๊ฑด์ด ๋ถ๋๋ค๋ฉด, ์ฒ์ w์ ํธ์ถํ ๋์๋ ์์ ๋๋ 20์ด ๋๋ ์๊ฐ ์ ๋ ฅ๋ ์๋ ์๊ธฐ ๋๋ฌธ์ ๋ฐฐ์ด์ ์ฐธ์กฐํ๊ณ ์ ํ ๋ IndexOutOfBoundException๊ณผ ๊ฐ์ ์๋ชป๋ ์ฐธ์กฐ๊ฐ ์ด๋ฃจ์ด์ง ์ ์๊ธฐ์ ์ด๋ฅผ ์ฒดํฌํ๊ธฐ ์ํ ๋ฉ์๋ inRange()๊ฐ ์ถ๊ฐ๋์๋ค.
728x90