본문 바로가기
백준 코딩테스트/실버

9184) 신나는 함수 실행 (C++)

by xortl98 2022. 4. 18.
728x90

 출처 

https://www.acmicpc.net/problem/9184

 

9184번: 신나는 함수 실행

입력은 세 정수 a, b, c로 이루어져 있으며, 한 줄에 하나씩 주어진다. 입력의 마지막은 -1 -1 -1로 나타내며, 세 정수가 모두 -1인 경우는 입력의 마지막을 제외하면 없다.

www.acmicpc.net

 내 풀이 

#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