1. 문제

5212번: 지구 온난화



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