: solved.ac - bronze 1

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

 

2163번: 초콜릿 자르기

정화는 N×M 크기의 초콜릿을 하나 가지고 있다. 초콜릿은 금이 가 있는 모양을 하고 있으며, 그 금에 의해 N×M개의 조각으로 나눠질 수 있다. 초콜릿의 크기가 너무 크다고 생각한 그녀는 초콜릿

www.acmicpc.net

 

 

예제 입력1

2 2

 

예제 출력1

3

 

예제 입력 2

1 1

 

예제 출력 2

0

 

정답

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main() {
	int n, m;
	scanf("%d %d", &n, &m);
	printf("%d", n * m - 1);
	return 0;
}


해설

: 수학적 규칙. n*m -1만 계산하면 답이 나온다.

(문제의 알고리즘 분류도 '수학' '사칙연산' 이다. 문제가 의도한 정석 풀이법도 이 방법이 맞는 듯.)

 

어려워 보이는 문제의 설명에 비해 허무할 정도로 간단한 정답 코드이다.

코딩을 어느 정도 배운 사람들은 보통 이 문제를 탐색이나 DP(Dynamic Programming)으로 접근하곤 하나

(횟수가 최소가 되도록 자르는 지점을 탐색하는 등)

기실 초콜릿 조각들을 여럿 겹쳐서 자를 수 있다는 조건이 없는 이상

최소고 뭐고 가능한 횟수의 경우의 수는 한 가지밖에 없다.

 

초콜릿은 처음에는 한 조각이다. 한 번 쪼개면 어떤 식으로 쪼갰든지 두 조각이 된다.

또 한 번 쪼개면 세 조각, 한 번 더 쪼개면 넷... 이런 식으로 '한 번 쪼개면 무조건 한 조각이 늘어나는' 규칙이 있다.

n*m의 격자대로 모든 조각이 나눠지길 원한다면, (한 조각에서 시작하므로) 당연히 n*m-1번 쪼개야 한다.

 

https://www.acmicpc.net/board/view/48119

 

글 읽기 - [스포] dp문제라서 dp로 풀었는데.. 허탈하네요

댓글을 작성하려면 로그인해야 합니다.

www.acmicpc.net

 

위는 DP로 푼 코드의 예시이다. 보통 유사한 다른 문제에서는 이런 접근법을 쓴다는 정도만 참고하고 넘어가자.

일견 알고리즘적으로 해결하기 어려운 문제도 수학적 규칙을 조금만 도입하면 손쉽게 풀린다는 것을 보여주는 예시가 되겠다.

+ Recent posts