๋ฌธ์
ํด๋น ํฌ์คํ ์ ๋ฐฑ์ค์ 9184๋ฒ ์ ๋๋ ํจ์ ์คํ ์ ์ ๊ทผ๊ณผ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ค๋ช ํ ๊ธ ์ ๋๋ค.
์ ๋ต ์์ค ์ฝ๋๋ฅผ ํ์ธํ์๋ ค๋ฉด solve url ์์ ํ์ธ ๊ฐ๋ฅํฉ๋๋ค.
9184๋ฒ: ์ ๋๋ ํจ์ ์คํ
์ ๋ ฅ์ ์ธ ์ ์ a, b, c๋ก ์ด๋ฃจ์ด์ ธ ์์ผ๋ฉฐ, ํ ์ค์ ํ๋์ฉ ์ฃผ์ด์ง๋ค. ์ ๋ ฅ์ ๋ง์ง๋ง์ -1 -1 -1๋ก ๋ํ๋ด๋ฉฐ, ์ธ ์ ์๊ฐ ๋ชจ๋ -1์ธ ๊ฒฝ์ฐ๋ ์ ๋ ฅ์ ๋ง์ง๋ง์ ์ ์ธํ๋ฉด ์๋ค.
www.acmicpc.net
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ด๋ค ๋ฐฉ์์ผ๋ก ์ ๊ทผํด์ผ ํ๋์ง๋ฅผ ๋จผ์ ์๊ฐํด๋ณด์.
๋ฌธ์ ์ ๊ทผ
์ด ๋ฌธ์ ๋ ์กฐ๊ธ ์ฌ๋ฐ๋ ๋ฌธ์ ์๋ค.
๋ณดํต ์ฐ๋ฆฌ๋ ๋ฌธ์ ์ ์ฃผ์ด์ง ์กฐ๊ฑด์ ๋ณด๊ณ ๋ถ์ํ์ฌ ์ฌ๊ท ํจ์๋ฅผ ๊ตฌํํด์ผ ํ์ง๋ง, ์ด ๋ฌธ์ ๋ ์์ ์ฌ๊ท ํจ์๋ฅผ ์ฃผ๊ณ ์คํ ์์ผ์ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ฌ์ค๋ผ๋ ๋ฌธ์ ๋ก, ์ฝ๊ฐ์ ์๊ฐ๋ง ํ๋ฉด ๋๋ ๋ฌธ์ ์ด๋ค.
์ด๋ฒ ๋ฌธ์ ์ ํต์ฌ์ ์ด๋ป๊ฒ ์ฌ๊ท ํจ์์ ์ฑ๋ฅ์ ํฅ์ ์ํฌ ๊ฒ์ด๋ ์ ๊ดํ ๋ฌธ์ ์ด๋ค.
์ง๋ ์ฌ๊ท ํธ์ถ์ ์ด๋ก ์์ ์ฌ๊ท ํจ์์ ์ฑ๋ฅ ํฅ์์ ์ํ ๋ฐฉ๋ฒ์ธ ๋ฉ๋ชจ์ด์ ์ด์ ์ ๋ํด์ ์์๋ณด์๋๋ฐ, ์ด ๋ฉ๋ชจ์ด์ ์ด์ ์ ์ฌ์ฉํ๋ฉด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ค.
ํด๊ฒฐ๋ฒ
์ด ์ฌ๊ท ํจ์๋ฅผ ๊ทธ๋ฅ ์คํ ์ํจ๋ค๋ฉด ์๋ง ์ต์
์ ๊ฒฝ์ฐ (20, 20, 20) ์์ 4^(20 + 20 + 20)
์ ์ฌ๊ท ํจ์์ call์ด ๋ฐ์ํ ๊ฒ์ด๋ค.
๊ทธ๋ผ ๋์ถฉ 1,099,511,627,776 * 3
์ ํธ์ถ์ด ์ด๋ฃจ์ด์ ธ์ผ ํ๋ค.
์ด ๋ฐฉ๋ฒ์ ์ฐ๋ฆฌ๋ Memoization์ ํตํด์ ์์ฃผ ํ๊ธฐ์ ์ผ๋ก ์ค์ผ ์ ์๋ค.
๊ฒฐ๋ก ์ ์ด ๋ฌธ์ ์ ํฐ ํต์ฌ์ ๋ฉ๋ชจ์ด์ ์ด์ ์ ์ฌ์ฉํ ์ค ์๋ ๋ชจ๋ฅด๋์ด๋ค.
์ ๋ต ์ฝ๋
public class Main {
static int[][][] arr = new int[51][51][51];
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
while(true) {
int a = input.nextInt();
int b = input.nextInt();
int c = input.nextInt();
if(a == -1 && c == -1 && b == -1) break;
if(a <= 0 || b <= 0 || c <= 0) {
System.out.printf("w(%d, %d, %d) = %d \n", a, b, c, 1);
}else {
System.out.printf("w(%d, %d, %d) = %d \n", a, b, c, w(a, b, c));
}
}
}
private 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) {
arr[a][b][c] = w(20, 20, 20);
return arr[a][b][c];
}
if(arr[a][b][c] != 0) return arr[a][b][c];
else {
if(a < b && b < c) {
arr[a][b][c] = w(a, b, c-1) + w(a, b-1, c-1) - w(a, b-1, c);
}
else {
arr[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 arr[a][b][c];
}
}
}
๋๊ธ