본문 바로가기

Problem Solving/BOJ 백준

[ BOJ 백준 2823 번 - 유턴 싫어 ] 해설 및 코드

https://www.acmicpc.net/problem/2823

 

2823번: 유턴 싫어

문제 상근이는 여자친구와의 드라이브를 위해서 운전을 배우고 있다. 도로 연수를 10년쯤 하다 보니 운전은 그럭저럭 잘하게 되었다. 하지만, 그는 유턴을 하지 못한다. 10년동안 도로 연수를 받았지만 유턴을 하지 못한다. 밥먹고 유턴만 연습했지만, 결국 유턴은 하지 못했다. 상근이는 유턴을 연습하기 위해서 시간을 투자하는 대신에 유턴을 할 필요가 없고, 유턴이 금지된 마을로 이사가려고 한다. 상근이가 이사가려고 하는 마을은 막다른 길이 있으면 안 된다. 막

www.acmicpc.net

 

목적

막다른 길이 있는지 없는지 확인한다.

 

접근법

1. 모든 길을 방문하여 막다른 길이 있는지 없는지 검사한다.

2. 막다른 길이 아니면, 상하좌우 네방향중 2방향 이상으로 이동할 수 있음을 인지한다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include<iostream>
#define f(a,b) for(int a=0;a<b;++a)
 
using namespace std;
int R, C,cnt;
int d[4][2= { {1,0},{-1,0},{0,1},{0,-1} };
string s[10];
 
bool canMove(int i, int j) {
    if (i == -1 || j == -1 || i == R || j == C|| s[i][j] == 'X')return false;
    return true;
}
 
bool solve() {
    f(i, R)f(j, C)if(s[i][j]=='.') {
        int cnt=0;
        f(k, 4)if (canMove(i + d[k][0], j + d[k][1]))++cnt;
        if (cnt == 1)return false;
    }
    return true;
}
 
int main() {
    cin >> R >> C;
    f(i, R)cin >> s[i];
    cout << (solve() ? 0 : 1)<<endl;
}