21608 c++ - 상어 초등학교

2024. 11. 26. 18:39🐣/BOJ

구현 문제

첫 접근은 요소에 관해서 구조체로 후보지를 선정하여 풀었는데, 
코드를 보다보니 너무 복잡해지고 조건 처리가 까다로워져서
각 자리에 맞춰서 후보자를 선정 후 조건에 맞춰서 넣어서 풀었습니다.

 

 

#include <iostream>
#include <map>
#include <vector>
#include <algorithm>

using namespace std;

int dx[] = {1, 0, -1, 0};
int dy[] = {0, 1, 0, -1};

struct SittingInfo {
  int r, c, emptyCount, favCount;

  bool operator<(const SittingInfo &o) const {
    if (this->favCount == o.favCount) {
      if (this->emptyCount == o.emptyCount) {
        if (this->r == o.r) {
          return this->c < o.c;
        }
        return this->r < o.r;
      }
      return this->emptyCount > o.emptyCount;
    }
    return this->favCount > o.favCount;
  }
};

int main() {
  int n;
  cin >> n;
  int N = n * n;

  vector<vector<int>> room(n, vector<int>(n, 0));
  vector<pair<int, vector<int>>> student;
  map<int, vector<int>> fav;

  for (int i = 0; i < n * n; i++) {
    int s, f1, f2, f3, f4;
    cin >> s >> f1 >> f2 >> f3 >> f4;

    student.push_back({s, {f1, f2, f3, f4}});
    fav[s] = {f1, f2, f3, f4};
  }

  for (auto entry : student) {
    int selected = entry.first;
    vector<SittingInfo> candidate;
    for (int r = 0; r < n; r++) {
      for (int c = 0; c < n; c++) {
        if (room[r][c] == 0) {
          int fC = 0;
          int eC = 0;
          for (int k = 0; k < 4; k++) {
            int nr = r + dy[k];
            int nc = c + dx[k];
            if (nc >= 0 && nr >= 0 && nc < n && nr < n) {
              if (room[nr][nc] != 0) {
                if (find(fav[selected].begin(), fav[selected].end(),
                         room[nr][nc]) != fav[selected].end())
                  fC++;
              } else {
                eC++;
              }
            }
          }
          candidate.push_back({r, c, eC, fC});
        }
      }
    }
    sort(candidate.begin(), candidate.end());
    room[candidate[0].r][candidate[0].c] = selected;
  }

  int result = 0;
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < n; j++) {
      int count = 0;
      for (int k = 0; k < 4; k++) {
        int nx = j + dx[k];
        int ny = i + dy[k];

        if (nx < 0 || ny < 0 || nx >= n || ny >= n) continue;
        if (find(fav[room[i][j]].begin(), fav[room[i][j]].end(),
                 room[ny][nx]) != fav[room[i][j]].end())
          count++;
      }
      if (count == 1)
        result += 1;
      else if (count == 2)
        result += 10;
      else if (count == 3)
        result += 100;
      else if (count == 4)
        result += 1000;
    }
  }
  cout << result;
  return 0;
}

 

'🐣 > BOJ' 카테고리의 다른 글

31796 c++ - 한빛미디어 (Easy)  (0) 2024.11.27
30049 c++ - 영업의 신  (0) 2024.11.24
20920 c++ - 영단어 암기는 괴로워  (0) 2024.11.23
6987 c++ - 월드컵  (0) 2024.11.20
10827 c++ - a^b  (0) 2024.11.17