본문 바로가기

BOJ 2163번 : 초콜릿 자르기 본문

BOJ

BOJ 2163번 : 초콜릿 자르기

00rigin 2020. 3. 15. 22:49

dp 문제에서 찾기 힘든 낮은 랭크의 문제. 초콜릿 자르기다.

 

n*m인 초콜릿을 1*1 로 모두 자르는데 몇번을 쪼개야 하는지를 묻고 있다. 최소한으로 쪼개는 것이지만, 한번에 길게 자르는것을 생각하면 n*m 과 m*n 은 항상 같은 횟수를 가지게 된다.

 

dp문제를 풀때 첫번째로 해야하는것. 초기값 설정이다. 이 문제에서 초기값은 1*m 또는 m*1 크기의 초콜릿을 자르는 횟수가 될것 이고, 이는 m-1회 일것이다.

 

이후 해야 하는것. 점화식 세우기. 3*3을 생각해보면 아래 그림처럼 나눌수 있을 것이다.

이렇게 잘라보면, 3*1 조각과 3*2 를 각각 최소한으로 자르는 횟수 +1 이 될것이다.

 

dp[n][m]이 n*m을 최소한으로 자르는 횟수라고 가정하면,

dp[n][m] = 1+dp[n][1] +dp[n][m-1] 이고,

n*m 과 m*n은 항상 같으므로, 작은 수를 n 이라고 고정해주면 된다.

 

<소스코드>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include<iostream>
#include<algorithm>
#define MAX(X,Y) ((X)>(Y)?(X):(Y))
using namespace std;
int main() {
    int dp[302][302= { 0, };
    int n, m = 0;
    cin >> n >> m;
    if (n == MAX(n, m)) {
        int temp = m;
        m = n;
        n = temp;
    }
    for (int i = 1; i < MAX(n,m)+1; i++)
        dp[1][i] = dp[i][1= i - 1;
    for (int i = 2; i < n + 1; i++) {
        for (int j = i; j < m + 1; j++) {
            dp[i][j] = 1 + dp[i][1+ dp[i][j - 1];
        }
    }
    cout << dp[n][m];
}
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter

 

문제 : 

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

 

2163번: 초콜릿 자르기

정화는 N×M 크기의 초콜릿을 하나 가지고 있다. 초콜릿은 금이 가 있는 모양을 하고 있으며, 그 금에 의해 N×M개의 조각으로 나눠질 수 있다. 초콜릿의 크기가 너무 크다고 생각한 그녀는 초콜릿을 친구들과 나눠 먹기로 했다. 이를 위해서 정화는 초콜릿을 계속 쪼개서 총 N×M개의 조각으로 쪼개려고 한다. 초콜릿을 쪼갤 때에는 초콜릿 조각을 하나 들고, 적당한 위치에서 초콜릿을 쪼갠다. 초콜릿을 쪼갤 때에는 금이 가 있는 위치에서만 쪼갤 수 있다. 이와

www.acmicpc.net

 

'BOJ' 카테고리의 다른 글

BOJ 1463번 : 1로 만들기  (0) 2020.03.15
BOJ 2579 : 계단 오르기  (0) 2020.03.15
BOJ 2293번 : 동전 1  (0) 2020.03.15
BOJ 1002번 : 터렛  (0) 2020.03.15
BOJ 1076번 : 저항  (0) 2020.03.15
Comments