https://www.acmicpc.net/problem/5212
바다로 변하는건 진짜 쉬운 것 같다.
인접한 칸을 모두 검사해야 하므로, 배열을 앞뒤로 1칸씩 더 잡아준다.
그 상태에서 4방향 검사하고 총 개수를 세면 됨.
인접한 바다들을 출력하지 않는 점이 키포인트 같았다.
처음에는 string
형태로 출력해줬는데, 이렇게하면 검색하기가 좀 빡세다.
아예 변화 후를 나타낼 2차원 배열을 하나 더 선언해준다.
(50년 후에는 배열 전체가 뿅!하고 한 번에 바뀌어야 하는데, 기존 배열을 사용하면 인접한 다른 땅이 영향을 받게 된다)
그 맵에 변화 이후를 표현해놓고,
땅이 있는 위치들 기준으로 상하좌우를 구한다.
최소X, 최대X, 최소Y, 최대Y를 구하는데, 각 땅에서 위 값들을 갱신해주면
해당 땅을 포함하는 가장 작은 직사각형을 구할 수 있다.
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int R, C;
bool map[12][12] = { false, };
bool final[12][12] = { false, };
int dir[2][4] = { {-1, 1, 0, 0}, {0, 0, -1, 1} };
void Solution()
{
for (int i = 1; i <= R; i++) {
for (int j = 1; j <= C; j++) {
if (map[i][j]) {
int cnt = 0;
for (int k = 0; k < 4; k++) {
int nextX = i + dir[0][k];
int nextY = j + dir[1][k];
if (!map[nextX][nextY])
cnt++;
}
if (cnt < 3)
final[i][j] = true;
}
}
}
}
int main()
{
cin >> R >> C;
string input;
for (int i = 1; i <= R; i++) {
cin >> input;
for (int j = 1; j <= C; j++) {
if (input[j-1] == 'X')
map[i][j] = true;
}
}
Solution();
int startX = R;
int startY = C;
int endX = 0;
int endY = 0;
bool check = false;
for (int i = 1; i <= R; i++) {
for (int j = 1; j <= C; j++) {
if (final[i][j]) {
startX = min(startX, i);
startY = min(startY, j);
endX = max(endX, i);
endY = max(endY, j);
}
}
}
for (int i = startX; i <= endX; i++) {
for (int j = startY; j <= endY; j++) {
if (final[i][j]) cout << 'X';
else cout << '.';
}
cout << '\n';
}
}
쉬운문제 편식 금지 수민아 제발 !