Post List

[BOJ] 백준 2823 유턴 싫어

[BOJ] 백준 2823 유턴 싫어



문제 링크  : https://www.acmicpc.net/problem/2823


이 문제는 어느 지점에서 출발을 하든지 다시 자기 위치로 돌아오면 되는 문제이다.
여기서 중요한 점은 자기가 방금 지나온 길로 다시 돌아가면 안된다는 것이다.
즉 매 길마다 갈 수 있는 선택지가 2개 이상은 있어야 한다.


소스코드  :




#include 
#include 
using namespace std;

int main() {
 int R, C;
 cin >> R >> C;
 string s;
 int **v = new int*[R];
 for (int i = 0; i < R; i++) {
  v[i] = new int[C];
 }
 cin.ignore();

 // 선택지(' . ') 를 가지는 길의 개수를 저장할 변수 선언
 int roadSize = 0;
 for (int i = 0; i < R; i++) {
  getline(cin, s);
  for (int j = 0; j < C; j++) {
   v[i][j] = s[j];
   if (v[i][j] == '.') roadSize++;
  }
 }
 
 for (int i = 0; i < R; i++) {
  for (int j = 0; j < C; j++) {
   int cnt = 0;

   // 한 선택지에서 동,서,남,북으로 이동할 수 있는 선택지 카운트.
   if (v[i][j] == '.') {
    if (i - 1 >= 0) {
     if (v[i - 1][j] == '.') cnt++;
    }
    if (j + 1 < C) {
     if (v[i][j + 1] == '.') cnt++;
    }
    if (i + 1 < R) {
     if (v[i + 1][j] == '.') cnt++;
    }
    if (j - 1 >= 0) {
     if (v[i][j - 1] == '.') cnt++;
    }
   }

   // 선택지가 2개 이상이면 세어야 할 길의 개수 줄임.
   if (cnt >= 2) roadSize--;
  }
  
 }

 // 길의 개수가 남아있다면 1, 아니면 0 출력
 if (roadSize) cout << 1 << endl;
 else cout << 0 << endl;
}

댓글