[백준] 5212 - 지구 온난화
1. 문제
2. 개요
섬과 바다로 이루어진 지역이 있다.
상하좌우로 인접한 3면 이상이 바다에 둘러쌓인 경우 50년 후 해당 지면은 바다에 잠겨버리게 된다.
한 지역의 지도가 주어지고, 50년 후의 지형을 예상해 미래의 지도를 그리려 한다.
섬의 개수가 줄어들기 때문에 50년 뒤의 지도는 크기가 더 작아지게 된다.
R x C 크기의 지도가 주어졌을 때, 50년 뒤의 지도를 출력하는 문제.
3. 풀이 및 코드
3-1. 풀이
50년 후 지도를 작성할 새 배열을 만들어 둔다.
현 지도를 입력받은 뒤, 미래 지도의 크기를 파악할 X, Y의 최소, 최대 변수들을 각각 만들어둔다.
입력받은 지도를 바탕으로 각 지형마다 항상 카운트를 0으로 초기화하며 4방향 탐색을 진행한다.
만약 인접 지형이 지도 밖이나 바다라면 카운트를 1씩 늘린다.
카운트가 3 이상이라면 바다에 잠기게 되므로 after의 해당 위치는 바다로 만들어준다.
그렇지 않다면 원래 지도의 지형을 그대로 가져온다. 이 때 육지라면 미래 지도의 크기를 파악하기 위한 변수인 X, Y의 최대, 최소 변수를 갱신해준다.
모든 위치에 대해 탐색이 끝났다면, 위에서 파악한 미래지도의 크기 변수를 이용해 미래 지도를 출력한다.
3-2. Python
import sys
dirY, dirX = [-1, 0, 1, 0], [0, -1, 0, 1]
R, C = map(int, sys.stdin.readline().split())
board = []
after = [[' ' for i in range(C)] for j in range(R)]
minX, minY, maxX, maxY = C, R, 0, 0
for i in range(R):
board.append(list(sys.stdin.readline().rstrip()))
for i in range(R):
for j in range(C):
cnt = 0
for d in range(4):
if i + dirY[d] < 0 or i + dirY[d] >= R or j + dirX[d] < 0 or j + dirX[d] >= C or board[i + dirY[d]][j + dirX[d]] == '.':
cnt += 1
if cnt >= 3:
after[i][j] = '.'
else:
after[i][j] = board[i][j]
if after[i][j] == 'X':
minX = min(minX, j)
minY = min(minY, i)
maxX = max(maxX, j)
maxY = max(maxY, i)
for i in range(minY, maxY + 1):
for j in range(minX, maxX + 1):
print(after[i][j], end ='')
print()
3-3. C#
namespace boj_5212
{
internal class Program
{
static void Main(string[] args)
{
StreamReader sr = new StreamReader(Console.OpenStandardInput());
StreamWriter sw = new StreamWriter(Console.OpenStandardOutput());
string[] input = sr.ReadLine().Split();
int[] dirY = { -1, 0, 1, 0 }, dirX = { 0, -1, 0, 1 };
int R = int.Parse(input[0]), C = int.Parse(input[1]);
char[,] board = new char[R, C];
char[,] after = new char[R, C];
int minY = R, maxY = 0, minX = C, maxX = 0;
for (int i = 0; i < R; i++)
{
string row = sr.ReadLine().TrimEnd();
for (int j = 0; j < C; j++)
{
board[i, j] = row[j];
}
}
for (int i = 0; i < R; i++)
{
for (int j = 0; j < C; j++)
{
int cnt = 0;
for (int d = 0; d < 4; d++)
{
if (i + dirY[d] < 0 || i + dirY[d] >= R || j + dirX[d] < 0 || j + dirX[d] >= C || board[i + dirY[d], j + dirX[d]] == '.')
cnt++;
}
if (cnt >= 3)
after[i, j] = '.';
else
{
after[i, j] = board[i, j];
if (after[i, j] == 'X')
{
minY = (int)MathF.Min(i, minY);
minX = (int)MathF.Min(j, minX);
maxY = (int)MathF.Max(i, maxY);
maxX = (int)MathF.Max(j, maxX);
}
}
}
}
for (int i = minY; i < maxY + 1; i++)
{
for (int j = minX; j < maxX + 1; j++)
{
sw.Write(after[i, j]);
}
sw.WriteLine();
}
sw.Close();
}
}
}
Comments