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 |