초콜릿 자르기 성공분류
시간 제한메모리 제한제출정답맞은 사람정답 비율
2 초 | 128 MB | 15747 | 11017 | 9554 | 71.293% |
문제
정화는 N×M 크기의 초콜릿을 하나 가지고 있다. 초콜릿은 금이 가 있는 모양을 하고 있으며, 그 금에 의해 N×M개의 조각으로 나눠질 수 있다.
초콜릿의 크기가 너무 크다고 생각한 그녀는 초콜릿을 친구들과 나눠 먹기로 했다. 이를 위해서 정화는 초콜릿을 계속 쪼개서 총 N×M개의 조각으로 쪼개려고 한다. 초콜릿을 쪼갤 때에는 초콜릿 조각을 하나 들고, 적당한 위치에서 초콜릿을 쪼갠다. 초콜릿을 쪼갤 때에는 금이 가 있는 위치에서만 쪼갤 수 있다. 이와 같이 초콜릿을 쪼개면 초콜릿은 두 개의 조각으로 나눠지게 된다. 이제 다시 이 중에서 초콜릿 조각을 하나 들고, 쪼개는 과정을 반복하면 된다.
초콜릿을 쪼개다보면 초콜릿이 녹을 수 있기 때문에, 정화는 가급적이면 초콜릿을 쪼개는 횟수를 최소로 하려 한다. 초콜릿의 크기가 주어졌을 때, 이를 1×1 크기의 초콜릿으로 쪼개기 위한 최소 쪼개기 횟수를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 두 정수 N, M(1≤N, M≤300)이 주어진다.
출력
첫째 줄에 답을 출력한다.
어떤 방식으로 풀어야할지 감이 안 잡혀서 블로그들을 많이 찾아봤다.
아래 블로그에서 도움을 많이 받았다.
https://flower0.tistory.com/69
[성실코딩 7일차] 백준 #2163 초콜릿 자르기 / 재귀, DP
처음에 문제 접했을 때는 "재귀함수 호출" 구조 풀면 되겠다 생각햇음. 그리고 풀고나서 과정들 적는데 왜 DP인지 이해갔음! 그 전에 계산했던 부분이 재사용되는 구조였음. 비슷한 문제로 피보��
flower0.tistory.com
재귀는 내가 어려워하는 방식 중 하나인데 이 문제가 딱 재귀를 사용하는 문제였다.
재귀를 사용하지 않고 공식을 찾는 방법도 있지만 다이나믹 프로그래밍 공부를 하기 위한 것이라서 재귀로 풀려고 노력했다.

3x3이 주어지면 위와 같은 단계를 거쳐 1x1로 쪼개진다. 행이 1개가 될 때 까지 쪼개고 행이 1개가 되면 열을 쪼갠다. 조각들이 각각 재귀를 통해 쪼개진다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
package rd;
import java.util.Scanner;
class split{
public int result = 0;
public void split(int n, int m) {
if(n == 1 && m == 1)
return;
if (n == 1){
result++;
split(n, m / 2);
split(n, m - m / 2);
}else {
result++;
split(n / 2, m);
split(n - n / 2, m);
}
}
}
public class distance {
public static void main(String args[]) {
Scanner s = new Scanner(System.in);
int n = s.nextInt();
int m = s.nextInt();
split test = new split();
test.split(n, m);
System.out.println(test.result);
}
}
|
cs |
'개인 공부 > 백준' 카테고리의 다른 글
[백준 9251번] LCS (0) | 2020.07.02 |
---|---|
[백준 14720번] 우유 축제 (0) | 2020.06.30 |
[백준 14724번] 관리자는 누구? (0) | 2020.06.30 |