Computer Science/Algorithm Problem

백준] 2858 - 기숙사 바닥(COCI 2010/2011)

TwinParadox 2018. 8. 3. 19:21
728x90

시간 제한 : 1초

메모리 제한 : 128MB




입력

첫째 줄에 빨간색 블럭의 수 R과 갈색 블럭의 B가 주어진다. (8 ≤ R ≤ 5000, 1 ≤ B ≤ 2,000,000)




출력

첫째 줄에 상근이네 방의 크기 L과 W을 공백으로 구분하여 출력한다. 만약, 두 수가 다르다면, 큰 수가 L이 되고 작은 수가 W이 된다. 항상 정답이 유일한 경우만 입력으로 주어진다.




소스코드

#include <iostream>
using namespace std;
int main(void)
{
	int r, b, sum;
	int sw, sl, w, l;
	cin >> r >> b;

	for (l = 1;; l++)
	{
		if (b%l == 0)
			w = b / l;
		sum = w * 2 + l * 2 + 4;
		if (sum == r)
		{
			if (w > l)
				cout << w + 2 << ' ' << l + 2;
			else
				cout << l + 2 << ' ' << w + 2;
			break;
		}
	}
}




Tip

빨간 블럭으로 갈색 블럭을 감싸기 위해선 갈색 블럭의 가로와 세로를 모두 덮어야 하므로 가로*2+세로*2가 필요하며 모서리를 채워야 하기 때문에 모서리 네 개를 더한 가로*2+세로*2+4라는 공식이 나온다. 이를 만족하는 조건들을 브루트 포스로 구한다.



728x90