Computer Science/Algorithm Problem

백준] 1652 - 누울 자리를 찾아라

TwinParadox 2018. 9. 23. 22:28
728x90

시간 제한 : 2초

메모리 제한 : 128MB




입력

첫째 줄에 방의 크기 N이 주어진다. N은 1이상 100이하의 정수이다. 그 다음 N줄에 걸쳐 N개의 문자가 들어오는데 '.'은 아무것도 없는 곳을 의미하고, 'X'는 짐이 있는 곳을 의미한다.




출력

첫째 줄에 가로로 누울 수 있는 자리와 세로로 누울 수 있는 자리의 개수를 출력한다.




소스코드

#include <iostream>
#include <vector>
#include <string>
using namespace std;
int main(void)
{
	int n, vertical = 0, horizontal = 0;

	cin >> n;
	vector<string> room(n);
	for (int i = 0; i < n; i++)
		cin >> room[i];

	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < n-1; j++)
		{
			if (room[i][j] == '.' && room[i][j + 1] == '.')
			{
				int k = j + 1;
				for (; k < n; k++)
				{
					if (room[i][k] == 'X')  
					{
						j = k;
						break;
					}
				}

				if (k == n)
					j = n;
				horizontal++;
			}
		}
	}
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < n - 1; j++)
		{
			if (room[j][i] == '.' && room[j+1][i] == '.')
			{
				int k = j + 1;
				for (; k < n; k++)
				{
					if (room[k][i] == 'X')
					{
						j = k;
						break;
					}
				}

				if (k == n)
					j = n;
				vertical++;
			}
		}
	}

	cout << horizontal << ' ' << vertical;
}




Tip

가로와 세로로 나눠서 문제를 해결하면 된다. 문제 분류는 수학으로 되어 있으나, 분류 시스템에 문제가 있는 것 같고, 수학보다는 기본 배열 지식에 가까운 것 같다. 유의해야 하는 케이스는 다음과 같다.


N이 1인 경우.

..X.. 같은 경우는 누울 자리가 1개가 아니라 2개다. X를 기준으로 왼쪽에 하나 오른쪽에 하나

...... 같은 경우는 누울 자리가 1개다.

.X.X.나, X.X.X 같이 띄엄띄엄 있는 경우도 부실한 코드는 오답 처리될 케이스다. 



728x90
728x90