본문 바로가기

알고리즘 문제

[C/C++ 백준 1660번] 캡틴 이다솜 (Silver 2)

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

 

1660번: 캡틴 이다솜

캡틴 이다솜은 자신의 해적선에 적을 공격하기 위한 대포알을 많이 보관해 놓는다. 다솜이는 미적감각이 뛰어나기 때문에, 대포알은 반드시 사면체 모양으로 쌓아놓아야 한다고 생각한다. 사면체를 만드는 방법은 길이가 N인 정삼각형 모양을 만든다. 그 위에 길이가 N-1인 정삼각형 모양을 얹고 그위에 계속 해서 얹어서 1크기의 정삼각형 모양을 얹으면 된다. 예를 들어, 사이즈가 3크기의 한 더미 모양은 다음과 같다. X X X X X X X X X X 각각의 삼각

www.acmicpc.net

얼마 전에 풀었던 제곱수와 비슷한 느낌의 문제이다. 제곱수가 아닌 사면체의 대포알 개수로만 달라졌다. 사면체의 대포알 개수 배열을 만들어놓고 (한 125번째까지가면 300000보다 커진다) 나머지 알고리즘은 제곱수와 같다.

 

배열 dp에서 tri의 원소를 하나씩 빼가면서, 가장 작은 경우가 무엇일지 비교해주자.


#include <cstdio>
#include <algorithm>
using namespace std;
int main(void){
	int bullet;
	scanf("%d",&bullet);
	int tri[200]={}, cnt1=0, cnt2=0, cnt3=0;
	int dp[300001]={0,1,};
	for(int i=0; i<125; i++){
		cnt1++;
		cnt2+=cnt1;
		cnt3+=cnt2;
		tri[i]=cnt3;
	}
	for(int i=2; i<=bullet; i++){
		int j=0, Findmin=300001;
		while(i-tri[j]>=0){
			Findmin=min(Findmin, dp[i-tri[j]]+1);
			j++;
		}
		dp[i]=Findmin;
		
	}
	printf("%d",dp[bullet]);
}