728x90
출처
https://www.acmicpc.net/problem/9184
내 풀이
#include<iostream>
using namespace std;
int dp[51][51][51];
int main()
{
for (int i = 0; i < 21; i++)
{
for (int j = 0; j < 21; j++)
{
for (int z = 0; z < 21; z++)
{
if (i <= 0 || j <= 0 || z <= 0)
{
dp[i][j][z] = 1;
}
else if (i < j && j < z)
{
dp[i][j][z] = dp[i][j][z - 1] + dp[i][j - 1][z - 1] - dp[i][j - 1][z];
}
else
{
dp[i][j][z] = dp[i - 1][j][z] + dp[i - 1][j - 1][z] + dp[i - 1][j][z - 1] - dp[i - 1][j - 1][z - 1];
}
}
}
}
int a = 0, b = 0, c = 0;
while (1)
{
cin >> a >> b >> c;
if (a == -1 && b == -1 && c == -1) break;
if (a <= 0 || b <= 0 || c <= 0) printf("w(%d, %d, %d) = 1\n", a, b, c);
else if (a > 20 || b > 20 || c > 20) printf("w(%d, %d, %d) = %d\n", a, b, c, dp[20][20][20]);
else printf("w(%d, %d, %d) = %d\n", a, b, c, dp[a][b][c]);
}
}
해설
3차원 배열을 선언후 문제안에 있는 재귀함수에 해당하는 값을 3중 for문으로 미리 넣어준다.
다만 a,b,c가 20이상 일때는 w(20,20,20)이므로 for문은 21까지만 반복하게 하였다.
그리고 while문 안에서 a,b,c가 -1이면 루프가 끝나게, a,b,c중 하나라도 0이면 1을 출력, a,b,c중 하나라도 20을 초과하면 w(20,20,20에 해당하는 그 외에는 조건에 맞게 해주었다.
새로 안 것
처음에 틀렸었는데 조건들을 천천히 다시 읽어보고 풀어보니 오타가 있었다. 그리고 풀고 난후 문제를 다시 해석해보니
좀 더 효율적으로 쓸 수 있을 것 같아서 3중 for문을 51까지가 아닌 21까지로 바꿔주었다. 뿌듯
'백준 코딩테스트 > 실버' 카테고리의 다른 글
1904) 01타일 (C++) (0) | 2022.04.19 |
---|---|
2667) 단지번호붙이기 (C++) (0) | 2022.04.19 |
1003) 피보나치 함수 (C++) (0) | 2022.04.17 |
2606) 바이러스 (C++) (0) | 2022.04.16 |
15904) UCPC는 무엇의 약자일까? (C++) (0) | 2022.04.16 |