BOJ 28128 - 현대모비스 특별상의 주인공은?

image.png

항상 인접한 두 칸이나 한 칸 떨어진 두 칸만 확인하고 거기에 같은 이름이 두 개 이상 있다면 가능하다.

왜냐면 $N \times M$에서 어떤 이름이 $\dfrac{ab+1}{2}$ 이상이 나온다고 해보자.

그럼 그 이름은 인접해있을 가능성이 크다. 거기서도 저만큼 인접한 두 칸만 봤을 때도 나오므로 정답에 그 이름을 넣어주면 된다.

그렇지 않다면 무조건 체스판 형태로 한 칸씩 떨어져있는 상태이다. 그렇다면 한 칸이 떨어져 있는 상태로 $3$칸 중 $2$칸만 차있어도 된다는 것을 알 수 있다.

void solve() {
   int Y, X;
   cin >> Y >> X;
   vector<vs> b(Y, vs(X));
   fv2(b);
   set<string> ans;
   for (int y = 0; y < Y - 1; y++)
      for (int x = 0; x < X; x++)
         if (b[y][x] == b[y + 1][x]) ans.insert(b[y][x]);
   for (int y = 0; y < Y; y++)
      for (int x = 0; x < X - 1; x++)
         if (b[y][x] == b[y][x + 1]) ans.insert(b[y][x]);
   for (int y = 0; y < Y - 2; y++)
      for (int x = 0; x < X; x++)
         if (b[y][x] == b[y + 2][x]) ans.insert(b[y][x]);
   for (int y = 0; y < Y; y++)
      for (int x = 0; x < X - 2; x++)
         if (b[y][x] == b[y][x + 2]) ans.insert(b[y][x]);
   if (!sz(ans)) cout << "MANIPULATED";
   else for (auto s: ans) cout << s << endl;
}

Tags:

Categories:

Updated:

Comments