Coding_Test_C++

BaekJoon 1706번: 크로스워드(C++)

https://www.acmicpc.net/problem/1706

 

1706번: 크로스워드

동혁이는 크로스워드 퍼즐을 좋아한다. R×C 크기의 크로스워드 퍼즐을 생각해 보자. 이 퍼즐은 R×C 크기의 표로 이루어지는데, 퍼즐을 다 풀면 금지된 칸을 제외하고는 각 칸에 알파벳이 하나씩

www.acmicpc.net

풀이법

1) 문자열 처리를 위해 여러번 반복을 한다면 풀 수 있는 문제이다.

 

2) 배열에서 #이 나오는 경우 크기가 2이상이면 결과값의 후보인 vec 배열에 넣어준다.

3) 배열에서 #이 나오는 경우 크기가 2미만이면 기존에 string 값을 초기화 시킨다.

 

4) 배열에서 #이 나오지 않으면, string에 값을 추가한다.

5) 배열에서 #이 나오지 않았으며, 마지막 행 혹은 열을 탐색 시

				if (s.size() == m)
					vec.push_back(s);
				else if (j == m - 1 && s.size() >= 2)
					vec.push_back(s);

사이즈가 열의 크기와 같거나, 행의 크기가 같은 경우와 사이즈가 2 이상인 경우에 후보 군인 vec 배열에 넣어준다.

#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
#include <stack>
#include <cstring>
#include <queue>
#include <set>
#include<map>
using namespace std;

int n, m;
char arr[21][21];
vector<string> vec;
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cin >> n >> m;
	for (int i = 0; i < n; i++)
	{
		string s;
		cin >> s;
		for (int j = 0; j < s.size(); j++)
		{
			arr[i][j] = s[j];
		}
	}
	for (int i = 0; i < n; i++)
	{
		string s;
		for (int j = 0; j < m; j++)
		{
			if (arr[i][j] != '#')
			{
				s = s + arr[i][j];
				if (s.size() == m)
					vec.push_back(s);
				else if (j == m - 1 && s.size() >= 2)
					vec.push_back(s);
			}
			else if (arr[i][j] == '#' && s.size() >= 2)
			{
				vec.push_back(s);
				s.clear();
			}
			else if (arr[i][j] == '#' && s.size() < 2)
			{
				s.clear();
			}
		}
	}
	for (int j = 0; j < m; j++)
	{
		string s;
		for (int i = 0; i< n; i++)
		{
			if (arr[i][j] != '#')
			{
				s = s + arr[i][j];
				if (s.size() == n)
					vec.push_back(s);
				else if (i == n - 1 && s.size() >= 2)
					vec.push_back(s);
			}
			else if (arr[i][j] == '#' && s.size() >= 2)
			{
				vec.push_back(s);
				s.clear();
			}
			else if (arr[i][j] == '#' && s.size() < 2)
			{
				s.clear();
			}
		}
	}
	sort(vec.begin(), vec.end());
	cout << vec[0];
}