[ 백준 ] 2823 / 유턴 싫어

金弘均·2021년 9월 16일
0

Baekjoon Online Judge

목록 보기
216/228
post-thumbnail

# Appreciation

/*
 * Problem :: 2823 / 유턴 싫어
 *
 * Kind :: Graph
 *
 * Insight
 * - 어떤 마을의 지도가 주어졌을 때,
 *   + 유턴을 하지 않고 마을의 모든 구역을 돌아다닐 수 있다는 것은
 *     막다른 길이 없다는 것과 같은 뜻이다
 *   + 유턴을 하지 않고 마을의 모든 구역을 돌아다닐 수 없다는 것은
 *     막다른 길이 있다는 것과 같은 뜻이다
 *     # 어떤 구역에 들어갔다고 가정하자
 *       그 구역에 들어가기 위해서는 분명 들어가는 길이 있어야 하므로
 *       적어도 그 구역과 인접한 길이 하나이상 있다
 *       이때, 들어가는 길 외에 다른 길이 없다면
 *       그 구역에서 나올때 들어갔던 길을 통해서 나와야 한다
 *       즉, 유턴을 해야하므로 이 구역은 막다른 길이다
 *       -> 막다른 길이 아니기 위해서는 인접한 길이 적어도 2개 이상이어야 함을 알 수 있다
 *
 * Point
 * - 사실 힌트를 봐서 더 어려웠던 문제였다
 *   처음에는 모든 사이클을 구하고 사이클끼리 모두 연결되어있는지를 알아내려고 했다
 *   물론 이렇게도 풀 수 있겠지만... 그렇게 한참을 헤매고 난뒤
 *   문제에서 친절히 막다른 길의 유무만으로 답을 구할 수 있다는 점을 넌지시 알려주는 것을 눈치챘다
 *   + 아니 힌트 모양이 너무 사이클처럼 보이지 않나요?!?
 *
 * - 막다른 곳은 인접한 길이 1개 또는 0개 이다
 *   + 1개일 때만을 막다른 곳으로 생각하지 않도록 주의하자
 */

# Code

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

#include <iostream>

using namespace std;

#define endl '\n'

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

// Set up : Functions Declaration
/* None */


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

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

    // Process
    bool isThereBlindLane = false;
    for (int i=0; i<R; i++) {
        for (int j=0; j<C; j++) {
            if (B[i][j] == '.') { /* 임의의 길 */
                int cnt = 0; /* 인접한 길의 개수 */
                for (int k=0; k<4; k++) {
                    int ay = i + dy[k];
                    int ax = j + dx[k];
                    if (ay >= 0 && ay < R && ax >= 0 && ax < C) {
                        if (B[ay][ax] == '.') {
                            cnt++;
                        }
                    }
                }
                if (cnt < 2) { /* 인접한 길이 2개 미만이라면  <= 막다른 곳이라면 */
                    isThereBlindLane = true;
                    break;
                }
            }
        }
    }

    // Control : Output
    cout << ((isThereBlindLane) ? 1 : 0) << endl;
}

// Helper Functions
/* None */
profile
이런 미친 게임을 봤나! - 옥냥이

0개의 댓글