-
2163번 : 초콜릿 자르기알고리즘 공부/백준 Python 코딩테스트 2021. 10. 7. 17:19
[ 문제 ]
정화는 N×M 크기의 초콜릿을 하나 가지고 있다.
초콜릿은 금이 가 있는 모양을 하고 있으며, 그 금에 의해 N×M개의 조각으로 나눠질 수 있다.
초콜릿의 크기가 너무 크다고 생각한 그녀는 초콜릿을 친구들과 나눠 먹기로 했다.
이를 위해서 정화는 초콜릿을 계속 쪼개서 총 N×M개의 조각으로 쪼개려고 한다.
초콜릿을 쪼갤 때에는 초콜릿 조각을 하나 들고, 적당한 위치에서 초콜릿을 쪼갠다.
초콜릿을 쪼갤 때에는 금이 가 있는 위치에서만 쪼갤 수 있다.
이와 같이 초콜릿을 쪼개면 초콜릿은 두 개의 조각으로 나눠지게 된다.
이제 다시 이 중에서 초콜릿 조각을 하나 들고, 쪼개는 과정을 반복하면 된다.
초콜릿을 쪼개다보면 초콜릿이 녹을 수 있기 때문에, 정화는 가급적이면 초콜릿을 쪼개는 횟수를 최소로 하려 한다.
초콜릿의 크기가 주어졌을 때, 이를 1×1 크기의 초콜릿으로 쪼개기 위한 최소 쪼개기 횟수를 구하는 프로그램을 작성하시오.
[ Input ]
첫째 줄에 두 정수 N, M(1 ≤ N, M ≤ 300)이 주어진다.
[ Output ]
첫째 줄에 답을 출력한다.
[ 풀이 ]
처음 문제를 봤을 땐 '아니, 이런 문제의 정답률이 71%나 된다고?' 하고 멘붕이 왔지만 다시 차분히 생각해보니 어이없이 쉬운 문제였다.
예를 들어서 생각해보면, 3x2 크기의 초콜릿이라면 먼저 세로로 1(=2-1)번 쪼갠다. 그러면 2개의 조각이 생기고 각 조각 별로 2(=3-1)번씩 쪼개므로 총 5(= (2-1) + 2 x (3-1))번 쪼개야 한다.
반대로 가로 부터 쪼갠다면 2(=3-1)번 쪼개고 새로 생긴 3개의 조각 별로 1(=2-1)번 씩 쪼개므로 총 횟수를 계산하면 (3-1) + 3 x (2-1) = 5번 쪼개는 것이다.
가로먼저 쪼개든 세로 먼저 쪼개든 차이가 없으므로 식을 정리해 보면 (N-1) + N x (M-1) = N - 1 + NM - N = NM -1 이라는 식이 나온다.
이렇게 쉬울 줄이야 ㅎㅎ 속상하다 ㅎㅎ
[ 코드 ]
N, M = map(int, input().split()) print(N*M-1)
'알고리즘 공부 > 백준 Python 코딩테스트' 카테고리의 다른 글
2935번 : 소음 (0) 2021.10.08 2675번 : 문자열 반복 (0) 2021.10.08 5355번 : 화성 수학 (0) 2021.10.08 2530번 : 인공지능 시계 (0) 2021.10.07 11022번 : A+B - 8 (0) 2021.10.07