컴굥일지

[BOJ/백준 14606][C++] 피자 (Small) 본문

알고리즘/코테 문제

[BOJ/백준 14606][C++] 피자 (Small)

gyong 2022. 4. 3. 18:31
반응형

문제

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

백준 14606

백준 14606
백준 14606

 

문제 내용

피자판의 탑을 분리하며 얻을 수 있는 즐거움의 최대치를 출력하는 것이다.

높이가 A인 탑을 높이가 B와 C인 탑으로 분리했다면, 이때 얻을 수 있는 즐거움의 크기는 B*C이다.

 

문제 풀이

일단, 높이가 A인 탑을 분리하여 가장 큰 즐거움을 얻기 위해서는, 분리하는 두 탑의 높이가 같거나 높이가 1 차이여야 한다.

ex) 7 => (1,6) (2,5) (3,4) => (3,4)로 나눌 때가 가장 값이 커진다.

ex) 6 => (1,5) (2,4) (3,3) => (3,3)으로 나눌 때가 가장 값이 커진다.

 

이 문제는 탑을 계속해서 나누어가야 하므로 dp를 이용하는 것이 좋다.

먼저, dp[1]=0, dp[2]=1이다.

피자판이 1개이면 나눌 것이 없으니 즐거움이 0이고, 피자판이 2개이면 (1,1)로 밖에 나눌 수 없으니 즐거움이 1이다.

 

그렇다면 그 이후는 어떻게 계산할까?

dp[3]= (2*1) + dp[2] +dp[1] 과 같이 계산하면 된다.

구하고자 하는 값이 dp[i]라면, i를 2로 나누어 어떻게 탑을 나눌지를 정한다.

그러고 해당 즐거움을 계산하면 (i/2) * (i - i/2)가 된다.

이후 탑을 계속해서 나누어 가므로, 이전에 계산해둔 값을 더하면 된다.(dp[i/2], dp[i - i/2]) 

 

코드

#include <iostream>
using namespace std;

int dp[11] = { 0, };
int main() {
	ios_base::sync_with_stdio(0);
	cin.tie(0); cout.tie(0);

	//입력
	int n; cin >> n;
	
	//문제 해결
	dp[1] = 0;
	dp[2] = 1;
	
	//dp[3] = (2 * 1) + dp[2] + dp[1];
	
	for (int i = 3; i <= n; i++) {
		int div = i / 2;
		dp[i] = (div * (i - div)) + dp[div] + dp[i - div];
	}

	cout << dp[n] << '\n';
}
반응형

'알고리즘 > 코테 문제' 카테고리의 다른 글

[BOJ/백준 2164][C++] 카드2  (0) 2022.04.09
[BOJ/백준 10828][C++] 스택  (0) 2022.04.08
[BOJ/백준 9658][C++] 돌 게임 4  (0) 2022.04.02
[BOJ/백준 2294][C++] 동전 2  (0) 2022.03.30
[BOJ/백준 15312][C++] 이름 궁합  (0) 2022.03.25
Comments