Computer Science/Algorithm Problem

백준] 5556 - 타일(일본정보올림피아드 2011;JOI 2011)

TwinParadox 2019. 3. 24. 11:09
728x90

시간 제한 : 1초

메모리 제한 : 128MB




입력

첫째 줄에 한 변의 길이 N이 주어진다. (1 ≤ N ≤ 109) 둘째 줄에는 창영이가 제거한 타일의 개수 K가 주어진다. (1 ≤ K ≤ 1000) 다음 줄부터 K개 줄에는 창영이가 제거한 타일의 위치 ai bi가 제거한 순서대로 주어진다. (1 ≤ ai ≤ N, 1 ≤ bi ≤ N) 타일은 왼쪽에서 ai번째, 위에서 bi번째에 있다. 같은 타일을 두 번 이상 제거하는 경우는 없다.




출력

창영이가 제거한 순서대로 타일의 색상을 출력한다. 빨간색은 1, 파란색은 2, 노란색은 3을 출력한다.




소스코드

#include <iostream>
using namespace std;
int main(void)
{
	int N, K, half;
	cin >> N >> K;
	half = N / 2;
	while (K--)
	{
		int a, b, color;
		cin >> a >> b;
		if (b <= half)
		{
			int start = b, end = N + 1 - b;
			if (a >= start && a <= end)
			{
				color = b % 3;
			}
			else
			{
				if (a <= half)
				{
					color = a % 3;
				}
				else
				{
					color = (N + 1 - a) % 3;
				}
			}
		}
		else
		{
			int start = N + 1 - b, end = b;
			if (a >= start && a <= end)
			{
				color = (N + 1 - b) % 3;
			}
			else
			{
				if (a <= half)
				{
					color = a % 3;
				}
				else
				{
					color = (N + 1 - a) % 3;
				}
			}
		}

		if (color == 0)
		{
			cout << 3;
		}
		else
		{
			cout << color;
		}
		cout << '\n';
	}
}




Tip

규칙적인 패턴만 파악하면 쉽게 구현할 수 있는 문제다. 타일의 사이즈가 N일 때, 위쪽 절반과, 아래쪽 절반에 대한 규칙을 찾는 방식으로 접근했다.



728x90