Coding_Test_C++
BaekJoon 1706번: 크로스워드(C++)
펄크럼
2021. 6. 18. 17:44
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];
}