본문 바로가기

algorithm/백준알고리즘

[백준알고리즘] 2163번: 초콜릿 자르기 -Python

728x90

[백준알고리즘] 2163번: 초콜릿 자르기 -Python

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

 

2163번: 초콜릿 자르기

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

www.acmicpc.net

처음에는 Dynamic Programming 방식으로 풀었다. 

 

NxM크기의 초콜릿을 우선 가로방향으로 잘라주며 (N//2)xM과 (N-N//2)xM 크기의 초콜릿으로 나눠주었고 각각 1x1크기로 나눌 수 있는 경우의 수의 합에 1을 더해주었다.

이후 세로방향도 마찬가지로 해주면서 메모이제이션을 통해 문제를 풀었었다.

 

하지만 굳이 이렇게 풀지 않아도 된다. 가로방향을 먼저자르든지 세로방향을 먼저 자르든지 항상 결과가 같은 것을 보고 구해지는 식을 찾았다.

 

가로방향으로 먼저 자른다고 했을 때, 나올 수 있는 경우의 수는 (N-1) * M + (M-1) = N*M - M + M - 1 = N*M - 1 이다.

 

따라서 N*M - 1을 출력하면 최소 쪼개는 횟수가 출력된다.

 

n, m = map(int, input().split())
print(n*m-1)

 

잘못된 점이나 부족한 점 지적해주시면 감사하겠습니다

728x90