⛔ 단순히 기록용 입니다... 어떻게 풀었는가 생각도 다시 해보고 그러니까 아마도 도움은 안되실 것 같습니다.
조건에 맞춰 구현하면 되는 문제입니다. 요즘 이사준비하느라 할일이 많아지고 회사에서도 새로운 제안서 작성으로 시간을 많이 소모했네요.. 이사준비가 예상처럼 쉽지가 않습니다.
이처럼 조건이 잘 맞아야 이사도 가능하니까 이 문제도 조건을 잘 풀어야합니다.
세로,가로를 파악하는데 중요한 점은 한곳에 세로 가로가 두개가 들어갈 수 있다는 것입니다. 그래서 한점에 방문했을때 가로 세로를 전부 파악해봅시다.
시작점은 가로는 좌측에 아무것도 없거나 벽이여야하고, 세로측은 위측에 아무것도 없거나 벽이여야합니다.
그리고 최소 세글자가 들어가야하기 때문에 두글자까지 범위를 넓혀 파악을 해봅시다. 그리고 이와중에 범위를 벗어나면 절대 안됩니다. 이것때문에 10분 이상을 뺏겨버렸네요. 요즘 예외 조건을 파악하는 것을 게을리한 결과입니다. 아래는 정답 코드입니다.
#include<iostream>
#include<vector>
#define MAX 52
using namespace std;
int answer,n,m,board[MAX][MAX],visited[MAX][MAX];
void init() {
answer = 0;
cin >> n >> m;
for(int i = 1; i <= n; i++){
for(int j = 1; j <= m; j++){
char c; cin >> c;
if(c == '.') board[i][j] = 0;
else board[i][j] = 1;
}
}
}
int isRange(int y, int x){
return 1 <= y && y <= n && 1 <= x && x <= m;
}
void findStartRow(int y, int x) {
if(!isRange(y, x - 1) || board[y][x - 1]){
if(isRange(y,x+1) && isRange(y,x+2) && !board[y][x+1] && !board[y][x+2]){
if(!visited[y][x]) {
visited[y][x] = 1;
answer++;
}
}
}
}
void findStartColumn(int y, int x){
if(!isRange(y - 1,x) || board[y - 1][x]){
if(isRange(y+1,x) && isRange(y+2,x) && !board[y+1][x] && !board[y+2][x]){
if(!visited[y][x]) {
visited[y][x] = 1;
answer++;
}
}
}
}
void printBoard() {
cout << "print board!" << "\n";
for(int i = 1; i <= n; i++){
for(int j = 1; j <= m; j++){
cout << board[i][j] << " ";
}
cout << "\n";
}
cout << "\n";
}
void solve() {
for(int i = 1; i <= n; i++){
for(int j = 1; j <= m; j++){
if(!board[i][j]){
findStartRow(i,j);
findStartColumn(i,j);
}
//printBoard();
}
}
}
void res() {
cout << answer << "\n";
for(int i = 1; i <= n; i++){
for(int j = 1; j <= m; j++){
if(visited[i][j]){
cout << i << " " << j << "\n";
}
}
}
}
int main() {
init();
solve();
res();
return 0;
}