๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿ“ ์•Œ๊ณ ๋ฆฌ์ฆ˜/BOJ

[C++/BOJ] 21608 : ์ƒ์–ด ์ดˆ๋“ฑํ•™๊ต (์‹œ๋ฎฌ๋ ˆ์ด์…˜)

https://www.acmicpc.net/problem/21608

๋ฌธ์ œ

์ƒ์–ด ์ดˆ๋“ฑํ•™๊ต์—๋Š” ๊ต์‹ค์ด ํ•˜๋‚˜ ์žˆ๊ณ , ๊ต์‹ค์€ N×N ํฌ๊ธฐ์˜ ๊ฒฉ์ž๋กœ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋‹ค. ํ•™๊ต์— ๋‹ค๋‹ˆ๋Š” ํ•™์ƒ์˜ ์ˆ˜๋Š” N2๋ช…์ด๋‹ค. ์˜ค๋Š˜์€ ๋ชจ๋“  ํ•™์ƒ์˜ ์ž๋ฆฌ๋ฅผ ์ •ํ•˜๋Š” ๋‚ ์ด๋‹ค. ํ•™์ƒ์€ 1๋ฒˆ๋ถ€ํ„ฐ N2๋ฒˆ๊นŒ์ง€ ๋ฒˆํ˜ธ๊ฐ€ ๋งค๊ฒจ์ ธ ์žˆ๊ณ , (r, c)๋Š” rํ–‰ c์—ด์„ ์˜๋ฏธํ•œ๋‹ค. ๊ต์‹ค์˜ ๊ฐ€์žฅ ์™ผ์ชฝ ์œ— ์นธ์€ (1, 1)์ด๊ณ , ๊ฐ€์žฅ ์˜ค๋ฅธ์ชฝ ์•„๋žซ ์นธ์€ (N, N)์ด๋‹ค.

์„ ์ƒ๋‹˜์€ ํ•™์ƒ์˜ ์ˆœ์„œ๋ฅผ ์ •ํ–ˆ๊ณ , ๊ฐ ํ•™์ƒ์ด ์ข‹์•„ํ•˜๋Š” ํ•™์ƒ 4๋ช…๋„ ๋ชจ๋‘ ์กฐ์‚ฌํ–ˆ๋‹ค. ์ด์ œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ทœ์น™์„ ์ด์šฉํ•ด ์ •ํ•ด์ง„ ์ˆœ์„œ๋Œ€๋กœ ํ•™์ƒ์˜ ์ž๋ฆฌ๋ฅผ ์ •ํ•˜๋ ค๊ณ  ํ•œ๋‹ค. ํ•œ ์นธ์—๋Š” ํ•™์ƒ ํ•œ ๋ช…์˜ ์ž๋ฆฌ๋งŒ ์žˆ์„ ์ˆ˜ ์žˆ๊ณ , |r1 - r2| + |c1 - c2| = 1์„ ๋งŒ์กฑํ•˜๋Š” ๋‘ ์นธ์ด (r1, c1)๊ณผ (r2, c2)๋ฅผ ์ธ์ ‘ํ•˜๋‹ค๊ณ  ํ•œ๋‹ค.

  1. ๋น„์–ด์žˆ๋Š” ์นธ ์ค‘์—์„œ ์ข‹์•„ํ•˜๋Š” ํ•™์ƒ์ด ์ธ์ ‘ํ•œ ์นธ์— ๊ฐ€์žฅ ๋งŽ์€ ์นธ์œผ๋กœ ์ž๋ฆฌ๋ฅผ ์ •ํ•œ๋‹ค.
  2. 1์„ ๋งŒ์กฑํ•˜๋Š” ์นธ์ด ์—ฌ๋Ÿฌ ๊ฐœ์ด๋ฉด, ์ธ์ ‘ํ•œ ์นธ ์ค‘์—์„œ ๋น„์–ด์žˆ๋Š” ์นธ์ด ๊ฐ€์žฅ ๋งŽ์€ ์นธ์œผ๋กœ ์ž๋ฆฌ๋ฅผ ์ •ํ•œ๋‹ค.
  3. 2๋ฅผ ๋งŒ์กฑํ•˜๋Š” ์นธ๋„ ์—ฌ๋Ÿฌ ๊ฐœ์ธ ๊ฒฝ์šฐ์—๋Š” ํ–‰์˜ ๋ฒˆํ˜ธ๊ฐ€ ๊ฐ€์žฅ ์ž‘์€ ์นธ์œผ๋กœ, ๊ทธ๋Ÿฌํ•œ ์นธ๋„ ์—ฌ๋Ÿฌ ๊ฐœ์ด๋ฉด ์—ด์˜ ๋ฒˆํ˜ธ๊ฐ€ ๊ฐ€์žฅ ์ž‘์€ ์นธ์œผ๋กœ ์ž๋ฆฌ๋ฅผ ์ •ํ•œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, N = 3์ด๊ณ , ํ•™์ƒ N2๋ช…์˜ ์ˆœ์„œ์™€ ๊ฐ ํ•™์ƒ์ด ์ข‹์•„ํ•˜๋Š” ํ•™์ƒ์ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ๋ฅผ ์ƒ๊ฐํ•ด๋ณด์ž.

ํ•™์ƒ์˜ ๋ฒˆํ˜ธ์ข‹์•„ํ•˜๋Š” ํ•™์ƒ์˜ ๋ฒˆํ˜ธ
4 2, 5, 1, 7
3 1, 9, 4, 5
9 8, 1, 2, 3
8 1, 9, 3, 4
7 2, 3, 4, 8
1 9, 2, 5, 7
6 5, 2, 3, 4
5 1, 9, 2, 8
2 9, 3, 1, 4

๊ฐ€์žฅ ๋จผ์ €, 4๋ฒˆ ํ•™์ƒ์˜ ์ž๋ฆฌ๋ฅผ ์ •ํ•ด์•ผ ํ•œ๋‹ค. ํ˜„์žฌ ๊ต์‹ค์˜ ๋ชจ๋“  ์นธ์€ ๋นˆ ์นธ์ด๋‹ค. 2๋ฒˆ ์กฐ๊ฑด์— ์˜ํ•ด ์ธ์ ‘ํ•œ ์นธ ์ค‘์—์„œ ๋น„์–ด์žˆ๋Š” ์นธ์ด ๊ฐ€์žฅ ๋งŽ์€ ์นธ์ธ (2, 2)์ด 4๋ฒˆ ํ•™์ƒ์˜ ์ž๋ฆฌ๊ฐ€ ๋œ๋‹ค.

     
  4  
     

๋‹ค์Œ ํ•™์ƒ์€ 3๋ฒˆ์ด๋‹ค. 1๋ฒˆ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ์นธ์€ (1, 2), (2, 1), (2, 3), (3, 2) ์ด๋‹ค. ์ด ์นธ์€ ๋ชจ๋‘ ๋น„์–ด์žˆ๋Š” ์ธ์ ‘ํ•œ ์นธ์ด 2๊ฐœ์ด๋‹ค. ๋”ฐ๋ผ์„œ, 3๋ฒˆ ์กฐ๊ฑด์— ์˜ํ•ด (1, 2)๊ฐ€ 3๋ฒˆ ํ•™์ƒ์˜ ์ž๋ฆฌ๊ฐ€ ๋œ๋‹ค.

  3  
  4  
     

๋‹ค์Œ์€ 9๋ฒˆ ํ•™์ƒ์ด๋‹ค. 9๋ฒˆ ํ•™์ƒ์ด ์ข‹์•„ํ•˜๋Š” ํ•™์ƒ์˜ ๋ฒˆํ˜ธ๋Š” 8, 1, 2, 3์ด๊ณ , ์ด ์ค‘์— 3์€ ์ž๋ฆฌ์— ์•‰์•„์žˆ๋‹ค. ์ข‹์•„ํ•˜๋Š” ํ•™์ƒ์ด ๊ฐ€์žฅ ๋งŽ์ด ์ธ์ ‘ํ•œ ์นธ์€ (1, 1), (1, 3)์ด๋‹ค. ๋‘ ์นธ ๋ชจ๋‘ ๋น„์–ด์žˆ๋Š” ์ธ์ ‘ํ•œ ์นธ์ด 1๊ฐœ์ด๊ณ , ํ–‰์˜ ๋ฒˆํ˜ธ๋„ 1์ด๋‹ค. ๋”ฐ๋ผ์„œ, 3๋ฒˆ ์กฐ๊ฑด์— ์˜ํ•ด (1, 1)์ด 9๋ฒˆ ํ•™์ƒ์˜ ์ž๋ฆฌ๊ฐ€ ๋œ๋‹ค.

9 3  
  4  
     

์ด๋ฒˆ์— ์ž๋ฆฌ๋ฅผ ์ •ํ•  ํ•™์ƒ์€ 8๋ฒˆ ํ•™์ƒ์ด๋‹ค. (2, 1)์ด 8๋ฒˆ ํ•™์ƒ์ด ์ข‹์•„ํ•˜๋Š” ํ•™์ƒ๊ณผ ๊ฐ€์žฅ ๋งŽ์ด ์ธ์ ‘ํ•œ ์นธ์ด๊ธฐ ๋•Œ๋ฌธ์—, ์—ฌ๊ธฐ๊ฐ€ ๊ทธ ํ•™์ƒ์˜ ์ž๋ฆฌ์ด๋‹ค.

9 3  
8 4  
     

7๋ฒˆ ํ•™์ƒ์˜ ์ž๋ฆฌ๋ฅผ ์ •ํ•ด๋ณด์ž. 1๋ฒˆ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ์นธ์€ (1, 3), (2, 3), (3, 1), (3, 2)๋กœ ์ด 4๊ฐœ๊ฐ€ ์žˆ๊ณ , ๋น„์–ด์žˆ๋Š” ์นธ๊ณผ ๊ฐ€์žฅ ๋งŽ์ด ์ธ์ ‘ํ•œ ์นธ์€ (2, 3), (3, 2)์ด๋‹ค. ํ–‰์˜ ๋ฒˆํ˜ธ๊ฐ€ ์ž‘์€ (2, 3)์ด 7๋ฒˆ ํ•™์ƒ์˜ ์ž๋ฆฌ๊ฐ€ ๋œ๋‹ค.

9 3  
8 4 7
     

์ด๋Ÿฐ์‹์œผ๋กœ ํ•™์ƒ์˜ ์ž๋ฆฌ๋ฅผ ๋ชจ๋‘ ์ •ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

9 3 2
8 4 7
5 6 1

์ด์ œ ํ•™์ƒ์˜ ๋งŒ์กฑ๋„๋ฅผ ๊ตฌํ•ด์•ผ ํ•œ๋‹ค. ํ•™์ƒ์˜ ๋งŒ์กฑ๋„๋Š” ์ž๋ฆฌ ๋ฐฐ์น˜๊ฐ€ ๋ชจ๋‘ ๋๋‚œ ํ›„์— ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•™์ƒ์˜ ๋งŒ์กฑ๋„๋ฅผ ๊ตฌํ•˜๋ ค๋ฉด ๊ทธ ํ•™์ƒ๊ณผ ์ธ์ ‘ํ•œ ์นธ์— ์•‰์€ ์ข‹์•„ํ•˜๋Š” ํ•™์ƒ์˜ ์ˆ˜๋ฅผ ๊ตฌํ•ด์•ผ ํ•œ๋‹ค. ๊ทธ ๊ฐ’์ด 0์ด๋ฉด ํ•™์ƒ์˜ ๋งŒ์กฑ๋„๋Š” 0, 1์ด๋ฉด 1, 2์ด๋ฉด 10, 3์ด๋ฉด 100, 4์ด๋ฉด 1000์ด๋‹ค.

ํ•™์ƒ์˜ ๋งŒ์กฑ๋„์˜ ์ด ํ•ฉ์„ ๊ตฌํ•ด๋ณด์ž.

์ž…๋ ฅ

์ฒซ์งธ ์ค„์— N์ด ์ฃผ์–ด์ง„๋‹ค. ๋‘˜์งธ ์ค„๋ถ€ํ„ฐ N2๊ฐœ์˜ ์ค„์— ํ•™์ƒ์˜ ๋ฒˆํ˜ธ์™€ ๊ทธ ํ•™์ƒ์ด ์ข‹์•„ํ•˜๋Š” ํ•™์ƒ 4๋ช…์˜ ๋ฒˆํ˜ธ๊ฐ€ ํ•œ ์ค„์— ํ•˜๋‚˜์”ฉ ์„ ์ƒ๋‹˜์ด ์ž๋ฆฌ๋ฅผ ์ •ํ•  ์ˆœ์„œ๋Œ€๋กœ ์ฃผ์–ด์ง„๋‹ค.

ํ•™์ƒ์˜ ๋ฒˆํ˜ธ๋Š” ์ค‘๋ณต๋˜์ง€ ์•Š์œผ๋ฉฐ, ์–ด๋–ค ํ•™์ƒ์ด ์ข‹์•„ํ•˜๋Š” ํ•™์ƒ 4๋ช…์€ ๋ชจ๋‘ ๋‹ค๋ฅธ ํ•™์ƒ์œผ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค. ์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง€๋Š” ํ•™์ƒ์˜ ๋ฒˆํ˜ธ, ์ข‹์•„ํ•˜๋Š” ํ•™์ƒ์˜ ๋ฒˆํ˜ธ๋Š” N2๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ž์—ฐ์ˆ˜์ด๋‹ค. ์–ด๋–ค ํ•™์ƒ์ด ์ž๊ธฐ ์ž์‹ ์„ ์ข‹์•„ํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ์—†๋‹ค.

์ถœ๋ ฅ

์ฒซ์งธ ์ค„์— ํ•™์ƒ์˜ ๋งŒ์กฑ๋„์˜ ์ด ํ•ฉ์„ ์ถœ๋ ฅํ•œ๋‹ค.


 

๊ณจ๋“œ 5..์ด์ง€๋งŒ ์ฒด๊ฐ์ƒ ๋” ์–ด๋ ค์šด ๋นก๊ตฌํ˜„ ๋ฌธ์ œ์ด๋‹ค

์‹œ๋ฎฌ๋ ˆ์ด์…˜ + bfs ๊ธฐ๋ฒ• ์‘์šฉ ๋Š๋‚Œ์ธ๋“ฏ??

์‚ผ์„ฑ SW ์—ญ๋Ÿ‰ํ…Œ์ŠคํŠธ ๊ธฐ์ถœ ๋ฌธ์ œ๋ผ๊ณ  ํ•œ๋‹ค.

 

์˜ค๋žœ๋งŒ์— ์ง„์งœ ๊ฐ๋„ ์•ˆ์žกํžˆ๋Š” ๋ฌธ์ œ๋ฅผ ์ ‘ํ•ด์„œ ๋ฉ˜๋ถ•์ด ์™”๋Š”๋ฐ,.. ๋‹ค๋ฅธ ์‚ฌ๋žŒ ์ฝ”๋“œ ๋ณด๊ณ  ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ฐจ๊ทผ์ฐจ๊ทผ ์ข…์ด์— ํœ˜๊ฐˆ๊ธฐ๋ฉฐ(?) ์ดํ•ดํ–ˆ๋‹ค

์ดํ•ดํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ•œ ํ”์  ใ…‹.ใ…‹

 

์ผ๋‹จ ์ค‘์š”ํ•œ๊ฑด BFS ์ขŒํ‘œ ๋ฌธ์ œ์ฒ˜๋Ÿผ dx, dy ์ƒํ•˜์ขŒ์šฐ ์ขŒํ‘œ ์ด๋™์„ ์ด์šฉํ•˜๋Š” ๊ฒƒ์„ ๋– ์˜ฌ๋ฆฌ๋Š” ๊ฒƒ์ด๋‹ค!!!

๊ทธ๋ฆฌ๊ณ  ๋ฒ”์œ„ ์ฒดํฌ๋„ ํ•„์ˆ˜๋กœ ํ•ด์ฃผ๋ฉด ๋จ

 

์ฝ”๋“œ์˜ ์ฒซ ๋ฐ˜๋ณต๋ฌธ์—์„œ๋Š” ํ•™์ƒ์„ ์ง€์ •ํ•˜๊ณ ,

๋‘๋ฒˆ์งธ & ์„ธ๋ฒˆ์งธ ๋ฐ˜๋ณต๋ฌธ์—์„œ๋Š” ์ž๋ฆฌ๋ฅผ ์ง€์ •ํ•˜๋ฉด ๋œ๋‹ค

 

1. ์ง€๋ชฉํ•œ ์ž๋ฆฌ์— ์‚ฌ๋žŒ์ด ์žˆ๋‹ค๋ฉด ๋‹น์—ฐํžˆ skipํ•ด์•ผ๊ฒ ์ง€

2. ์ง€๋ชฉํ•œ ์ž๋ฆฌ๋งˆ๋‹ค ์ƒํ•˜์ขŒ์šฐ๋ฅผ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค. ๋‹น์—ฐํžˆ ๋ฒ”์œ„ ๋ฐ–์ด๋ผ๋ฉด skipํ•ด์ค€๋‹ค.

3. ์ƒ/ํ•˜/์ขŒ/์šฐ ๊ฐ€ ๋น„์–ด์žˆ๊ฑฐ๋‚˜, ์ข‹์•„ํ•˜๋Š” ์นœ๊ตฌ๊ฐ€ ์•‰์•„์žˆ์„ ๋•Œ๋Š” ๋ณ€์ˆ˜๋ฅผ +1 ํ•ด์ค€๋‹ค

4. ์ƒํ•˜์ขŒ์šฐ ๋ชจ๋‘ ํŒ๋‹จ ํ›„, ๋ณ€์ˆ˜ ๊ฐ’์ด max ๊ฐ’์ด๋ผ๋ฉด ๋Œ€์ฒด, ์•„๋‹ˆ๋ผ๋ฉด ๊ทธ๋ƒฅ ๊ฑด๋„ˆ๋›ฐ๊ธฐ

5. max ๊ฐ’์ธ ์ขŒํ‘œ๋กœ ํ•™์ƒ์„ ๋ฐฐ์น˜ํ•ด์ค€๋‹ค.

 

 

 

 

๋‚˜์˜ ํ’€์ด

// ์ƒ์–ด ์ดˆ๋“ฑํ•™๊ต
#include<iostream>
#include<algorithm>
using namespace std;

int n;
int seat[21][21];
int stds[401];
int like[401][4];
int dx[4] = {0, 1, 0, -1};
int dy[4] = {1, 0, -1, 0};
int satis = 0;

int main(){
    cin >> n;
    for (int i = 0; i < n*n; ++i){
        cin >> stds[i];
        for (int j = 0; j < 4; ++j){
            cin >> like[stds[i]][j];
        }
    }

    seat[1][1] = stds[0];
    for (int s = 1; s < n * n;++s){
        
        int nowStudent = stds[s];
        int maxEmpty = -1;
        int maxLove = -1;
        int x = -1;
        int y = -1;
        for (int i = 0; i < n; ++i){
            for (int j = 0; j < n; ++j){
                if(seat[i][j]!=0) continue; // ์ž๋ฆฌ๊ฐ€ ์ฐจ์žˆ์„ ๊ฒฝ์šฐ ์Šคํ‚ต
                int empty = 0;
                int love = 0;
                for (int d = 0; d < 4;++d){
                    int nx = j + dx[d];
                    int ny = i + dy[d];
                    if(nx<0||ny<0||nx>=n||ny>=n) // ๋ฒ”์œ„ ์ฒดํฌ
                        continue;
                    if(seat[ny][nx]==0){ // ๋น„์–ด์žˆ์„๋•Œ
                        empty++;
                        continue;
                    }
                    for (int k = 0; k < 4;++k){
                        if(seat[ny][nx]==like[nowStudent][k]){ // ์ข‹์•„ํ•˜๋Š” ์นœ๊ตฌ์ผ๋•Œ
                            love++;
                            break; // ์—†์–ด๋„ ๋ฌด๋ฐฉํ• ๋“ฏ
                        }
                    }
                }
                if(love > maxLove){
                    maxLove = love;
                    maxEmpty = empty;
                    x = j;
                    y = i;
                } else if(love==maxLove){
                    if(empty > maxEmpty){
                        maxLove = love;
                        maxEmpty = empty;
                        x = j;
                        y = i;
                    }
                }
                
            }
            
        }
        seat[y][x] = nowStudent; // ํ•™์ƒ ์ž๋ฆฌ ๋ฐฐ์น˜
    }
    // for (int i = 0; i < n; ++i){
    //     for (int j = 0; j < n;++j)
    //         cout << seat[i][j] << " ";
    //     cout << "\n";
    // }

        for (int i = 0; i < n; ++i)
        {
            for (int j = 0; j < n; ++j)
            {
                int student = seat[i][j]; // ๊ทธ ์ž๋ฆฌ์˜ ํ•™์ƒ
                int love = 0;             // ์ธ์ ‘ํ•œ ์ข‹์•„ํ•˜๋Š” ํ•™์ƒ ์ˆ˜
                for (int d = 0; d < 4; ++d)
                {
                    int nx = j + dx[d];
                    int ny = i + dy[d];
                    if (nx < 0 || ny < 0 || nx >= n || ny >= n) // ๋ฒ”์œ„ ์ฒดํฌ
                        continue;
                    for (int k = 0; k < 4; ++k)
                    {
                        if (seat[ny][nx] == like[student][k])
                        { // ์ข‹์•„ํ•˜๋Š” ์นœ๊ตฌ์ผ๋•Œ
                            love++;
                            break; // ์—†์–ด๋„ ๋ฌด๋ฐฉํ• ๋“ฏ
                        }
                    }
                }
                if (love == 1)
                    satis += 1;
                if (love == 2)
                    satis += 10;
                if (love == 3)
                    satis += 100;
                if (love == 4)
                    satis += 1000;
            }
        }
    cout << satis;
}