[ 백준 ] 5212 / 지구 온난화

金弘均·2021년 9월 15일
0

Baekjoon Online Judge

목록 보기
98/228
post-thumbnail
post-custom-banner

# Appreciation

/*
 * Problem :: 5212 / 지구 온난화
 *
 * Kind :: Simulation
 *
 * Insight
 * - 인접한 칸들을 확인해서 땅이 잠기는지 그렇지 않은지 확인하는 건 쉽다
 *   + 문제는... 출력해야되는 지도가 작아진다는 것이다!
 *     # 출력해야되는 지도의 왼쪽 위 좌표와 오른족 아래 좌표를 잡고
 *       잠기지 않은 땅을 발견할 때마다 이를 갱신해주는 식으로
 *       지도의 크기를 추적해주자
 */

# Code

//
//  BOJ
//  ver.C++
//
//  Created by GGlifer
//
//  Open Source

#include <iostream>
#include <cstring>

using namespace std;

#define endl '\n'

// Set up : Global Variables
int R, C;
int dy[4] = {+1, 0, 0, -1};
int dx[4] = {0, +1, -1, 0};

// Set up : Functions Declaration
bool isValid(int y, int x);


int main()
{
    // Set up : I/O
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    // Set up : Input
    cin >> R >> C;
    char A[R][C];
    for (int i=0; i<R; i++)
        for (int j=0; j<C; j++)
            cin >> A[i][j];

    // Process
    char B[R][C]; /* 50년 후 지도 */
    memcpy(B, A, sizeof(B));

    /* 출력해야되는 직사각형 지도의 왼쪽 위 좌표, 오른쪽 아래 좌표 초기화
     * ul - upper left, lr - lower right */
    int uly = R, ulx = C, lry = -1, lrx = -1;

    for (int i=0; i<R; i++) {
        for (int j=0; j<C; j++) {
            if (A[i][j] == 'X') {
                int sea = 0; /* 인접한 바다칸 개수 */
                for (int k=0; k<4; k++) {
                    int ay = i + dy[k];
                    int ax = j + dx[k];
                    if (not(isValid(ay, ax)) || A[ay][ax] == '.') {
                        sea++;
                    }
                }
                if (sea >= 3) { /* 인접한 바다칸 개수가 3개 이상이면 */
                    B[i][j] = '.'; /* 50년 후 잠김 */
                } else { /* 인접한 바다칸 개수가 3개 미만이면 50년 후 잠기지 않음 */
                    /* 잠기지 않는 땅 발견 - 지도의 왼쪽 위, 오른쪽 아래 좌표 갱신 */
                    uly = min(uly, i); /* 왼쪽 위 y 좌표 갱신 */
                    ulx = min(ulx, j); /* 왼쪽 위 x 좌표 갱신 */
                    lry = max(lry, i); /* 오른쪽 아래 y 좌표 갱신 */
                    lrx = max(lrx, j); /* 오른쪽 아래 x 좌표 갱신 */
                }
            }
        }
    }

    // Control : Output
    for (int i=uly; i<=lry; i++) {
        for (int j=ulx; j<=lrx; j++) {
            cout << B[i][j];
        } cout << endl;
    }
}

// Helper Functions
bool isValid(int y, int x)
/* 주어진 좌표 (y,x) 가 유효하면 true 를 반환, 그 외 false 를 반환 */
{
    return y >= 0 && y < R && x >= 0 && x < C;
}
profile
이런 미친 게임을 봤나! - 옥냥이
post-custom-banner

0개의 댓글