๋ฌธ์
์ฝ๋
#include <iostream>
#include <vector>
using namespace std;
int N, ans;
int map[21][21];
int favorite[442][5];
int dr[4] = {0,0,-1,1};
int dc[4] = {-1,1,0,0};
int peo[442][4];
vector<pair<int,int>> find_blank(){ // ํ์ฌ ๋น์ด์๋ ์ขํ์ฐพ๊ธฐ
vector<pair<int,int>> v; // ๋น์ด์๋ ์นธ์ ์ขํ๋ฅผ ๋ด์ ๋ฒกํฐ
for(int i=0; i<N; i++){
for(int k=0; k<N; k++){
if(map[i][k] == 0) v.push_back({i, k});
}
}
return v;
}
vector<pair<int,int>> find_near_blank(vector<pair<int,int>> v){
vector<pair<int,int>> coor;
vector<pair<int,pair<int,int>>> blank_cnt_check;
int max_black_cnt = 0;
for(auto it : v){
int r = it.first;
int c = it.second;
int blank_cnt_temp = 0;
for(int i=0; i<4; i++){
int nr = r + dr[i];
int nc = c + dc[i];
if(nr >= 0 && nr < N && nc >= 0 && nc < N){
for(int k = 1; k < 5; k++){
if(map[nr][nc] == 0) blank_cnt_temp++;
}
}
}
if(blank_cnt_temp >= max_black_cnt){
max_black_cnt = blank_cnt_temp;
blank_cnt_check.push_back({max_black_cnt,{r,c}});
}
}
for(auto it: blank_cnt_check){
if(it.first == max_black_cnt) coor.push_back({it.second.first, it.second.second});
}
return coor;
}
vector<pair<int,int>> find_near_favorite(int idx, vector<pair<int,int>> blank_coor){ // ์ข์ํ๋ ํ์์ด ๊ฐ์ฅ ๋ง์ ์ธ์ ํ ์นธ ์ขํ ์ฐพ๊ธฐ
vector<pair<int,int>> coor;
vector<pair<int,pair<int,int>>> favorite_cnt_check;
int max_favorite_cnt = 0;
for(auto it: blank_coor){
int r = it.first;
int c = it.second;
int favorite_cnt_temp = 0;
for(int i=0; i<4; i++){
int nr = r + dr[i];
int nc = c + dc[i];
if(nr >= 0 && nr < N && nc >= 0 && nc < N){
for(int k = 1; k < 5; k++){
if(favorite[idx][k] == map[nr][nc]) favorite_cnt_temp++;
}
}
}
if(favorite_cnt_temp >= max_favorite_cnt){
max_favorite_cnt = favorite_cnt_temp;
favorite_cnt_check.push_back({max_favorite_cnt, {r, c}});
}
}
for(auto it: favorite_cnt_check){
if(it.first == max_favorite_cnt) coor.push_back({it.second.first, it.second.second});
}
return coor;
}
vector<pair<int,int>> find_min_r(vector<pair<int,int>> coor){
int min_r = 1e9;
vector<pair<int,int>> v;
for(auto it : coor) min_r = min(min_r, it.first);
for(auto it : coor){
if(it.first == min_r) v.push_back({it.first, it.second});
}
return v;
}
vector<pair<int,int>> find_min_c(vector<pair<int,int>> coor){
int min_c = 1e9;
vector<pair<int,int>> v;
for(auto it : coor) min_c = min(min_c, it.second);
for(auto it : coor){
if(it.second == min_c) v.push_back({it.first, it.second});
}
return v;
}
void survey(){
for(int i=0; i<N; i++){
for(int j=0; j<N; j++){
int score = 0;
for(int k=0; k<4; k++){
int nr = i + dr[k];
int nc = j + dc[k];
if(nr >= 0 && nr < N && nc >= 0 && nc < N){
for(int z = 0; z<4; z++){
if(peo[map[i][j]][z] == map[nr][nc]) score++;
}
}
}
if(score == 1) ans += 1;
else if(score == 2) ans += 10;
else if(score == 3) ans += 100;
else if(score == 4) ans += 1000;
}
}
}
void simulation(){
for(int i=0; i<N*N; i++){
vector<pair<int,int>> coor = find_near_favorite(i, find_blank()); // ๋น์ด์๋ ์นธ ์ค์์ ์ข์ํ๋ ํ์์ด ์ธ์ ํ ์นธ์ ๊ฐ์ฅ ๋ง์ ์นธ์ผ๋ก ์๋ฆฌ๋ฅผ ์ ํ๋ค.
if(coor.size() > 1){ // 1์ ๋ง์กฑํ๋ ์นธ์ด ์ฌ๋ฌ ๊ฐ์ด๋ฉด, ์ธ์ ํ ์นธ ์ค์์ ๋น์ด์๋ ์นธ์ด ๊ฐ์ฅ ๋ง์ ์นธ์ผ๋ก ์๋ฆฌ๋ฅผ ์ ํ๋ค.
coor = find_near_blank(coor);
if(coor.size() > 1){ // 2๋ฅผ ๋ง์กฑํ๋ ์นธ๋ ์ฌ๋ฌ ๊ฐ์ธ ๊ฒฝ์ฐ์๋ ํ์ ๋ฒํธ๊ฐ ๊ฐ์ฅ ์์ ์นธ์ผ๋ก ์ ํ๋ค.
coor = find_min_r(coor);
if(coor.size() > 1){ // ๊ทธ๋ฌํ ์นธ๋ ์ฌ๋ฌ ๊ฐ์ด๋ฉด ์ด์ ๋ฒํธ๊ฐ ๊ฐ์ฅ ์์ ์นธ์ผ๋ก ์๋ฆฌ๋ฅผ ์ ํ๋ค.
coor = find_min_c(coor);
}
}
}
map[coor.front().first][coor.front().second] = favorite[i][0];
}
survey();
}
int main(){
ios_base::sync_with_stdio(false);
cin.tie(0);
cin>>N;
for(int i=0; i<N * N; i++){
int _peo = 0;
for(int k=0; k<5; k++){
int inp; cin>>inp;
if(k == 0) _peo = inp;
if(k != 0) peo[_peo][k-1] = inp;
favorite[i][k] = inp;
}
}
simulation();
cout<<ans;
}
ํ์ด
์ฝ๋๊ฐ ์ฑ์ ํํฉ์ ๋ค๋ฅธ ์ฌ๋๋ค๊ณผ๋ ๋ค๋ฅด๊ฒ.. ์๋์ ์ผ๋ก ์ฝ๋๊ฐ ๊ธธ๊ธด ํ๋ฐ ๊ทธ๋๋ ํ ๋ฒ์ ํํผ์ง๋ ์์ด ์ถฉ์คํ๊ฒ ํ ๋ฒ์ ๊ตฌํ์ ์ฑ๊ณตํ์ต๋๋ค.
- ๋น์ด์๋ ์นธ ์ค์์ ์ข์ํ๋ ํ์์ด ์ธ์ ํ ์นธ์ ๊ฐ์ฅ ๋ง์ ์นธ์ผ๋ก ์๋ฆฌ๋ฅผ ์ ํ๋ค.
- 1์ ๋ง์กฑํ๋ ์นธ์ด ์ฌ๋ฌ ๊ฐ์ด๋ฉด, ์ธ์ ํ ์นธ ์ค์์ ๋น์ด์๋ ์นธ์ด ๊ฐ์ฅ ๋ง์ ์นธ์ผ๋ก ์๋ฆฌ๋ฅผ ์ ํ๋ค.
- 2๋ฅผ ๋ง์กฑํ๋ ์นธ๋ ์ฌ๋ฌ ๊ฐ์ธ ๊ฒฝ์ฐ์๋ ํ์ ๋ฒํธ๊ฐ ๊ฐ์ฅ ์์ ์นธ์ผ๋ก, ๊ทธ๋ฌํ ์นธ๋ ์ฌ๋ฌ ๊ฐ์ด๋ฉด ์ด์ ๋ฒํธ๊ฐ ๊ฐ์ฅ ์์ ์นธ์ผ๋ก ์๋ฆฌ๋ฅผ ์ ํ๋ค.
- 1๋ฒ ์กฐ๊ฑด์ ๊ตฌํํ๊ธฐ ์ํด์ ๋จผ์ ๋น์ด์๋ ์นธ์ ์ฐพ๋ find_blank() ํจ์๋ฅผ ์ ์ํ์ต๋๋ค. ์ข์ํ๋ ํ์์ด ์ธ์ ํ ์นธ์ ๊ฐ์ฅ ๋ง์ ์นธ์ ์ฐพ๊ธฐ ์ํด find_near_favorite() ํจ์๋ฅผ ์ ์ํ์ต๋๋ค.
- 2๋ฒ ์กฐ๊ฑด์ ๋ง์กฑํ๊ธฐ ์ํด์ find_near_blank() ํจ์๋ฅผ ์ ์ํ์ต๋๋ค.
- 3๋ฒ ์กฐ๊ฑด์ ๋ง์กฑํ๊ธฐ ์ํด์ find_min_r() ๊ณผ find_min_c() ํจ์๋ฅผ ์ ์ํด์ ํ์ ๋ฒํธ์ ์ด์ ๋ฒํธ๊ฐ ๊ฐ์ฅ ์์ ์นธ์ ์ฐพ๋๋ก ๊ตฌํํ์ต๋๋ค.
- ๋ง์ง๋ง์ผ๋ก survey() ํจ์๋ฅผ ์ ์ํด์ ๋ง์กฑ๋๋ฅผ ์กฐ์ฌํ์ต๋๋ค.
'Algorithm ๐ง๐ปโ๐ป > ๋ฐฑ์ค(BOJ)' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค,c++] 21278๋ฒ - ํธ์์ด ๋ ๋ง๋ฆฌ ์นํจ (0) | 2022.09.18 |
---|---|
[๋ฐฑ์ค,c++] 15661๋ฒ - ๋งํฌ์ ์คํํธ (0) | 2022.09.18 |
[๋ฐฑ์ค,c++] 6987๋ฒ - ์๋์ปต (0) | 2022.09.18 |
[๋ฐฑ์ค,c++] 22856๋ฒ - ํธ๋ฆฌ ์ํ (0) | 2022.09.18 |
[๋ฐฑ์ค,c++] 16719๋ฒ - ZOAC (0) | 2022.09.16 |
[๋ฐฑ์ค,c++] 17276๋ฒ - ๋ฐฐ์ด ๋๋ฆฌ๊ธฐ (0) | 2022.09.15 |
๋๊ธ