BOJ 2628 종이자르기


사용한 알고리즘

  • 구현, 수학

알고리즘 설명

  • 두 개의 배열을 생성하여 잘려진 지점을 저장한다.
  • 두 배열은 x축의 잘린지점과 y축의 잘린 지점을 저장한다.
  • 두 잘린지점을 각각 모두 저장한뒤에 정렬한다.
  • 이를 이용하면 잘린 뒤 만들어진 모든 사각형을 표현할 수 있다.
  • 공식은 아래와 같다.
  • 사각형 넓이 = (xaxis(i+1)-xaxix(i))*(yaxis(j+1)-yaxis(j))
  • 위 공식으로 모든 i(x축 잘린 개수)와 모든 j(y축 잘린 개수)를 이용하여 사각형 크기를 측정한다.
  • 코드를 쉽게 하기 위해 xaxis(0)와 yaxis(0)를 처음 지점인 0으로 설정하고, xaxis(xend+1)와 yaxis(yend+1)는 C와 R(각 사각형 바운드)를 저장한다.
  • 모든 사각형 중에 가장 큰 사각형을 출력한다.

풀이

// baekjoon 2628 yechan
#include <cstdio>
#include <algorithm>
using namespace std;
const int MAX_N=101;

int R, C, K, xaxis[MAX_N], yaxis[MAX_N];
int ret, xpos, ypos, cmd, value;

int main() {
	scanf("%d%d", &C, &R);
	scanf("%d", &K);
// 0번째 인덱스는 초기 0으로 설정
	xaxis[xpos++]=0;
	yaxis[ypos++]=0;
// 잘려지는 지점 저장하기
	for (int i=0; i<K; i++) {
		scanf("%d %d", &cmd, &value);
		if (cmd) xaxis[xpos++] = value;
		else yaxis[ypos++] = value;
	}
// 마지막 값에는 종이의 마지막 지점인 가로와 세로 값 저장
	xaxis[xpos++]=C;
	yaxis[ypos++]=R;
// 이를 정렬함
	sort(xaxis, xaxis+xpos);
	sort(yaxis, yaxis+ypos);
// 모든 사각형에 접근하여 가장 큰 사각형을 ret에 저장
	for (int i=0; i<xpos-1; i++)
		for (int j=0; j<ypos-1; j++)
			ret = max(ret, (xaxis[i+1]-xaxis[i])*(yaxis[j+1]-yaxis[j]));
// 결과 출력
	printf("%d\n", ret);
	return 0;
}



© 2020.08. by fbdp1202

Powered by theorydb