본문 바로가기

Algorithm

4014. [모의 SW 역량테스트] 활주로 건설

반응형

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWIeW7FakkUDFAVH&categoryId=AWIeW7FakkUDFAVH&categoryType=CODE

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

 

 

높이를 기준으로 높아질 때와 낮아질 때를 구분해서 활주로를 건설할 수 있는가 없는가 분석하는 로직을 짜면 됨.

 

#include<iostream>
#include<string.h>
using namespace std;

int arr[20][20];
bool visit[20];
int N, X;

int main(int argc, char** argv)
{
	int test_case;
	int T;

	cin >> T;
	/*
	   여러 개의 테스트 케이스가 주어지므로, 각각을 처리합니다.
	*/
	for (test_case = 1; test_case <= T; ++test_case)
	{
		cin >> N >> X;
		for (int i = 0; i < N; i++)
		{
			for (int j = 0; j < N; j++)
			{
				cin >> arr[i][j];
			}
		}

		int count = 0;
		//가로 행
		for (int i = 0; i < N; i++)
		{
			memset(visit, 0, sizeof(visit));
			int cur = arr[i][0];
			bool flag = true;
			for (int j = 1; j < N; j++)
			{
				
				if (arr[i][j] > cur + 1 || arr[i][j] < cur - 1)
				{
					flag = false;
					break;
				}

				if (arr[i][j] == cur + 1)
				{
					int num = 0;
					for (int k = j - 1; k >= 0; k--)
					{
						if (num >= X)
						{
							break;
						}

						if (arr[i][k] == cur && !visit[k])
						{
							visit[k] = true;
							num++;
						}
						else
						{
							break;
						}
					}

					cur++;
					if (num < X)
					{
						
						flag = false;
						break;
					}
				}
				else if (arr[i][j] == cur - 1)
				{
					int num = 0;
					for (int k = j; k < N; k++)
					{
						if (num >= X)
						{
							break;
						}
						if (arr[i][k] == cur - 1 && !visit[k])
						{
							visit[k] = true;
							num++;
						}
						else
						{
							break;
						}
					}
					cur--;
					if (num < X)
					{

						flag = false;
						break;
					}
				}
			}

			if (flag)
			{
				count++;
			}
		}
		//세로 행

		for (int j = 0; j < N; j++)
		{
			memset(visit, 0, sizeof(visit));
			int cur = arr[0][j];
			bool flag = true;
			for (int i = 0; i < N; i++)
			{
				
				if (arr[i][j] > cur + 1 || arr[i][j] < cur - 1)
				{
					flag = false;
					break;
				}

				if (arr[i][j] == cur + 1)
				{
					int num = 0;
					for (int k = i - 1; k >= 0; k--)
					{
						if (num >= X)
						{
							break;
						}
						if (arr[k][j] == cur && !visit[k])
						{
							visit[k] = true;
							num++;
						}
						else
						{
							break;
						}
					}
					cur++;
					if (num < X)
					{

						flag = false;
						break;
					}
				}
				else if (arr[i][j] == cur - 1)
				{
					int num = 0;
					for (int k = i; k < N; k++)
					{
						if (num >= X)
						{
							break;
						}
						if (arr[k][j] == cur - 1 && !visit[k])
						{
							visit[k] = true;
							num++;
						}
						else
						{
							break;
						}
					}
					cur--;
					if (num < X)
					{

						flag = false;
						break;
					}
				}
			}

			if (flag)
			{
				count++;
			}

		}
		cout << "#" << test_case << " " << count << endl;
	}
	return 0;//정상종료시 반드시 0을 리턴해야합니다.
}
반응형