Logo냥냠감자기술 블로그
Skip to Content
AlgorithmDP (31)제곱수 찾기
작성일: 2024-01-14

문제

백준 15989 - 제곱수 찾기 

  • 난이도: 골드5
  • 알고리즘: DP

코드

#include <iostream> #include <vector> using namespace std; vector<vector<int>> cache(10001, vector<int>(4, -1)); // bef: 이전에 선택한 숫자. 1, 2, 3 중 하나. int getCaseNum(int input, int bef) { if(input<0) return 0; if(input==0) return 1; if(cache[input][bef]!=-1) return cache[input][bef]; int ret=0; for(int i=1; i<=bef; i++) { ret+=getCaseNum(input-i, i); } return cache[input][bef]=ret; } int main() { int testCase; cin>>testCase; for(; testCase>0; testCase--) { int input; cin>>input; cout<<getCaseNum(input,3)<<"\n"; } }

회고

그래도 역시 DP 문제는 볼 때마다 기분이 좋은거 같다.
처음엔 일차원 배열에 값을 저장할 생각이었지만, 같은 숫자 구성의 순서만 다른 경우는 같은 경우로 간주한다는 조건을 처리하기 위해 2차원 배열을 사용했다.
1, 2, 3 각각의 개수를 세는 방법으로 풀어볼까 하다가 수열을 오름차순으로 배치한다는 규칙을 두면 자연스럽게 중복되는 경우가 제거되겠다는 생각이 들어 이전에 선택했던 숫자를 인자로 받아 그 숫자보다 작은 숫자를 고르도록 하였다. 이 때문에 2차원 배열이 필요했다.
이번주 스터디는 DP를 하기로 했는데 어떻게 설명을 해야 할지 고민이다. 아무래도 어려운 파트인 만큼 설명을 잘 해줘야 할 것 같은데 조금 걱정이 된다.