본문 바로가기
알고리즘 문제풀이/백준

[백준 9184] 신나는 함수 실행

by m2162003 2021. 1. 13.

www.acmicpc.net/problem/9184

 

9184번: 신나는 함수 실행

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

www.acmicpc.net

바본가...출력 형식을 무시해서 이유없이 코드를 고쳤다....

 

문제에서도 나와있지만: 재귀함수로는 어렵지 않지만 시간 초과가 발생하는 문제이다.

그럼 당연 dp지

 

라고 생각했지만 확신은 없었다 ㅋㅋㅋㅋㅋㅋ 3차원 배열..?진짜..? 진짜였다.

 

주어진 조건대로

1. 셋 중 하나라도 0이하

-> return 1

2. 셋 중 하나라도 20이상

-> w(20, 20, 20) 호출

3. a<b<c

어떤 식

4. 그 외

어떤 식

 

이런 구조다.

 

그렇다묜 1번 2번을 진행해서 a,b,c를 적절하게 변환하고

dp[a][b][c]값이 있다면 그 값을 리턴

아직 없다면 값을 찾으러 재귀 실행! 이 되어야 할 것이다.

그래서 코드가 요렇다

 

#include <stdio.h>

using namespace std;
int dp[21][21][21];
int a, b, c;

int ref(int a, int b, int c)
{

  if (a <= 0 || b <= 0 || c <= 0)
  {
    return dp[0][0][0] = 1;
  }

  if (a > 20 || b > 20 || c > 20)
  {
    return ref(20, 20, 20);
  }

  if (dp[a][b][c] != 0)
  {
    return dp[a][b][c];
  }

  if (a < b && b < c)
  {
    return dp[a][b][c] = ref(a, b, c - 1) + ref(a, b - 1, c - 1) - ref(a, b - 1, c);
  }
  else
  {
    return dp[a][b][c] = ref(a - 1, b, c) + ref(a - 1, b - 1, c) + ref(a - 1, b, c - 1) - ref(a - 1, b - 1, c - 1);
  }
}

int main(void)
{

  while (1)
  {
    scanf("%d%d%d", &a, &b, &c);
    if (a == -1 && b == -1 && c == -1)
    {
      break;
    }
    int res = ref(a, b, c);
    printf("w(%d, %d, %d) = %d\n", a, b, c, res);
  }
  return 0;
}

'알고리즘 문제풀이 > 백준' 카테고리의 다른 글

[백준 17298] 오큰수  (0) 2021.01.14
[백준 13305] 주유소  (0) 2021.01.14
[백준 20055] 컨베이어 벨트 위의 로봇  (0) 2021.01.13
[백준 1712] 손익분기점  (0) 2021.01.06
[백준 1504] 특정한 최단 경로  (0) 2021.01.06

댓글