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

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

[์ฝ”๋“œํŠธ๋ฆฌ] ์˜ˆ์ˆ ์„ฑ - ์‹œ๋ฎฌ๋ ˆ์ด์…˜, BFS/DFS (๊ธฐ์ถœ๋ฌธ์ œ)

์‚ผ์„ฑ SW ์—ญ๋Ÿ‰ํ…Œ์ŠคํŠธ 2022 ์ƒ๋ฐ˜๊ธฐ ๊ธฐ์ถœ 

์˜ˆ์ˆ ์„ฑ

์˜ˆ์ˆ ๊ฐ€ Sam์€ ๊ทธ๋ฆผ์— ๋Œ€ํ•œ ์˜ˆ์ˆ ์„ฑ์„ ํ‰๊ฐ€ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋งŒ๋“ค์–ด๋ƒˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆผ์„ ํŽธ์˜์ƒ n * n ํฌ๊ธฐ์˜ ๊ฒฉ์ž๋กœ ์ƒ๊ฐํ•˜๊ณ , ๊ฐ ์นธ์˜ ์ƒ‰๊น”์„ 1์ด์ƒ 10์ดํ•˜์˜ ์ˆซ์ž๋กœ ํ‘œํ˜„ํ•˜์—ฌ ์ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ ์šฉํ•ด๋ณด๋ ค ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ์€ 5 * 5 ํฌ๊ธฐ์˜ ๊ทธ๋ฆผ์˜ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค.

๋จผ์ € ์ด ๊ทธ๋ฆผ์—์„œ ๋™์ผํ•œ ์ˆซ์ž๊ฐ€ ์ƒํ•˜์ขŒ์šฐ๋กœ ์ธ์ ‘ํ•ด์žˆ๋Š” ๊ฒฝ์šฐ ๋™์ผํ•œ ๊ทธ๋ฃน์ด๋ผ ๋ณธ๋‹ค๋ฉด, ์ด 4๊ฐœ์˜ ๊ทธ๋ฃน์ด ๋งŒ๋“ค์–ด์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์˜ˆ์ˆ  ์ ์ˆ˜๋Š” ๋ชจ๋“  ๊ทธ๋ฃน ์Œ์˜ ์กฐํ™”๋กœ์›€์˜ ํ•ฉ์œผ๋กœ ์ •์˜๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฃน a์™€ ๊ทธ๋ฃน b์˜ ์กฐํ™”๋กœ์›€์€ (๊ทธ๋ฃน a์— ์†ํ•œ ์นธ์˜ ์ˆ˜ + ๊ทธ๋ฃน b์— ์†ํ•œ ์นธ์˜ ์ˆ˜ ) x ๊ทธ๋ฃน a๋ฅผ ์ด๋ฃจ๊ณ  ์žˆ๋Š” ์ˆซ์ž ๊ฐ’ x ๊ทธ๋ฃน b๋ฅผ ์ด๋ฃจ๊ณ  ์žˆ๋Š” ์ˆซ์ž ๊ฐ’ x ๊ทธ๋ฃน a์™€ ๊ทธ๋ฃน b๊ฐ€ ์„œ๋กœ ๋งž๋‹ฟ์•„ ์žˆ๋Š” ๋ณ€์˜ ์ˆ˜๋กœ ์ •์˜๋ฉ๋‹ˆ๋‹ค.

์˜ˆ๋กœ <Figure 2> ์—์„œ ๋‘ ๊ทธ๋ฃน G2, G4์˜ ์กฐํ™”๋กœ์›€์€ (11 + 8) x 2 x 1 x 4 = 152๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฃน ์Œ ๊ฐ„์˜ ์กฐํ™”๋กœ์›€ ๊ฐ’์ด 0๋ณด๋‹ค ํฐ ์กฐํ•ฉ์ธ (G1, G2), (G2, G3), (G2, G4), (G3, G4) ์˜ ์กฐํ™”๋กœ์›€ ๊ฐ’์„ ์ „๋ถ€ ๋”ํ•˜๋ฉด 48 + 192 + 152 + 156 = 548์ด ๋ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์ดˆ๊ธฐ ์˜ˆ์ˆ  ์ ์ˆ˜๋ผ ๋ถ€๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

์ดˆ๊ธฐ ์˜ˆ์ˆ  ์ ์ˆ˜๋ฅผ ๊ตฌํ•œ ๋’ค์—๋Š” ๊ทธ๋ฆผ์— ๋Œ€ํ•œ ํšŒ์ „์„ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

ํšŒ์ „์€ ์ •์ค‘์„ ๊ธฐ์ค€์œผ๋กœ ๋‘ ์„ ์„ ๊ทธ์–ด ๋งŒ๋“ค์–ด์ง€๋Š” ์‹ญ์ž ๋ชจ์–‘๊ณผ ๊ทธ ์™ธ ๋ถ€๋ถ„์œผ๋กœ ๋‚˜๋‰˜์–ด ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค.

  • ์‹ญ์ž ๋ชจ์–‘์˜ ๊ฒฝ์šฐ ํ†ต์งธ๋กœ ๋ฐ˜์‹œ๊ณ„ ๋ฐฉํ–ฅ์œผ๋กœ 90' ํšŒ์ „ํ•ฉ๋‹ˆ๋‹ค.

  • ์‹ญ์ž ๋ชจ์–‘์„ ์ œ์™ธํ•œ 4๊ฐœ์˜ ์ •์‚ฌ๊ฐํ˜•์€ ๊ฐ๊ฐ ๊ฐœ๋ณ„์ ์œผ๋กœ ์‹œ๊ณ„ ๋ฐฉํ–ฅ์œผ๋กœ 90'์”ฉ ํšŒ์ „์ด ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค.

๋‘ ๋ถ€๋ถ„์— ๋Œ€ํ•œ ํšŒ์ „์ด ๋™์‹œ์— ์ง„ํ–‰๋˜๋ฏ€๋กœ ํšŒ์ „ ์ดํ›„ <Figure 4>๋Š” ๋‹ค์Œ ๋ชจ์Šต์ด ๋ฉ๋‹ˆ๋‹ค.

์ด์ œ <Figure 7>์˜ ์˜ˆ์ˆ  ์ ์ˆ˜ ์—ญ์‹œ ๋งˆ์ฐฌ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์œผ๋กœ ๊ตฌํ•˜๋ฉด 442์ ์ด ๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” 1ํšŒ์ „ ์ดํ›„ ์˜ˆ์ˆ  ์ ์ˆ˜๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

n * n ํฌ๊ธฐ์˜ ๊ทธ๋ฆผ ์ •๋ณด๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ์ดˆ๊ธฐ ์˜ˆ์ˆ  ์ ์ˆ˜, 1ํšŒ์ „ ์ดํ›„ ์˜ˆ์ˆ  ์ ์ˆ˜, 2ํšŒ์ „ ์ดํ›„ ์˜ˆ์ˆ  ์ ์ˆ˜, ๊ทธ๋ฆฌ๊ณ  3ํšŒ์ „ ์ดํ›„ ์˜ˆ์ˆ  ์ ์ˆ˜์˜ ํ•ฉ์„ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•ด๋ณด์„ธ์š”.

์ž…๋ ฅ ํ˜•์‹

์ฒซ ๋ฒˆ์งธ ์ค„์— n์ด ์ฃผ์–ด์ง‘๋‹ˆ๋‹ค. n์€ ๋ฐ˜๋“œ์‹œ ํ™€์ˆ˜์ž…๋‹ˆ๋‹ค.
์ดํ›„ n๊ฐœ์˜ ์ค„์— ๊ฑธ์ณ ๊ฐ ํ–‰์— ์น ํ•ด์ ธ ์žˆ๋Š” ์ƒ‰๊น”์— ๋Œ€ํ•œ ์ •๋ณด์ธ ์ˆซ์ž๋“ค์ด ๊ณต๋ฐฑ์„ ์‚ฌ์ด์— ๋‘๊ณ  ์ฃผ์–ด์ง‘๋‹ˆ๋‹ค.

  • 3 ≤ n ≤ 29
  • 1 ≤ ์ฃผ์–ด์ง€๋Š” ์ˆซ์ž ≤ 10

์ถœ๋ ฅ ํ˜•์‹

์ฒซ ๋ฒˆ์งธ ์ค„์— ์ดˆ๊ธฐ ์˜ˆ์ˆ  ์ ์ˆ˜, 1ํšŒ์ „ ์ดํ›„ ์˜ˆ์ˆ  ์ ์ˆ˜, 2ํšŒ์ „ ์ดํ›„ ์˜ˆ์ˆ  ์ ์ˆ˜, ๊ทธ๋ฆฌ๊ณ  3ํšŒ์ „ ์ดํ›„ ์˜ˆ์ˆ  ์ ์ˆ˜๋ฅผ ๋ชจ๋‘ ํ•ฉํ•œ ๊ฐ’์„ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.


 

ํ•ด์„ค ์ฐธ๊ณ ํ•˜๋ฉด์„œ ํ’€์—ˆ๋Š”๋ฐ๋„

ํ•˜๋‚˜ํ•˜๋‚˜ ์ดํ•ดํ•˜๋ฉด์„œ ๋‹ค ๋”ฐ์ ธ๊ฐ€๋ฉด์„œ ํ‘ธ๋Š๋ผ ๋ฌธ์ œ ์ฝ๋Š”๊ฒƒ๋ถ€ํ„ฐ ํ’€์ด ์„ฑ๊ณต๊นŒ์ง€ ์ด 3์‹œ๊ฐ„์ด ๊ฑธ๋ฆฐ ๋ฌธ์ œ....

 

์•ˆ๋…•ํ•˜์„ธ์š” ๋„์„œ๊ด€ ์ง€๋ฐ•๋ น์ž…๋‹ˆ๋‹ค

์š”์ฆ˜ ํ•™๊ต๋„์„œ๊ด€์ด ๋ฐค 12์‹œ๊นŒ์ง€ ์šด์˜ํ•˜๋Š”๋ฐ

์˜ค๋Š˜๋„ 12์‹œ๊นŒ์ง€ ๊ณต๋ถ€ํ•˜๋‹ค๊ฐ€ ์˜ด ๐Ÿค“

 

๋ฌธ์ œ๊ฐ€ ๊ธธ๊ณ  ์š”๊ตฌ์‚ฌํ•ญ์ด ๋งŽ์€ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ๋ฌธ์ œ๊ฐ€ ์š”์ฆ˜ ์ฝ”ํ…Œ ํŠธ๋ Œ๋“œ๋ผ๊ณ  ํ•˜๋„ค์š”,,,

๋งŽ์ด ํ’€๋ฉด์„œ ์ตํ˜€์•ผ ์‹ค๋ ฅ์ด ๋Š˜ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค!

 

์˜ˆ์ˆ ์„ฑ ๋ฌธ์ œ๋Š” ์‚ผ์„ฑ ๊ธฐ์ถœ ๋นก๊ตฌํ˜„์ด๊ณ 

dfs/bfs ์‘์šฉ๋ ฅ๊ณผ ์•ฝ๊ฐ„์˜ ๊ณต๊ฐ„์ง€๊ฐ๋Šฅ๋ ฅ(?)์ด ํ•„์š”ํ•œ ๋“ฏ ํ•ฉ๋‹ˆ๋‹ค

 

์ฒ˜์Œ์— ์ž…๋ ฅ๋ฐ›๊ณ  ๋‚˜์„œ ๊ทธ๋ฃน๋ฒˆํ˜ธ์— ๋”ฐ๋ฅธ ๋งต์„ ๋งŒ๋“ค๊ณ , ์–ด๋–ค ๊ทธ๋ฃน์— ๋ช‡ ๊ฐœ์˜ ์ˆ˜๊ฐ€ ์žˆ๋Š”์ง€ ๋ชจ๋‘ ์ €์žฅํ•ด๋†”์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํ•ฉ๊ณ„๋ฅผ ๊ตฌํ•˜๋Š” ๊ณผ์ •์—์„œ๋Š” ํƒ์ƒ‰ ๋ง๊ณ  ์ด์ค‘๋ฐ˜๋ณต๋ฌธ์œผ๋กœ ๊ตฌํ˜„ํ•ด์•ผ ๋นผ๋จน์ง€ ์•Š๊ณ  ํ•ฉ๊ณ„๋ฅผ ๊ตฌํ•ด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

๊ทธ๋ฆฌ๊ณ  ์ค‘๋ณต๋˜๋Š” ๋ถ€๋ถ„์ด ์ƒ๊ธฐ๋ฏ€๋กœ 2๋กœ ๋‚˜๋ˆ ์ค˜์•ผ ํ•จ

 

๋งˆ์ง€๋ง‰์— ๋‹ต์ด ๊ณ„์† ํ‹€๋ ค์„œ ํ—ค๋ฉจ๋Š”๋ฐ, rotateํ• ๋•Œ๋งˆ๋‹ค ์ „์—ญ๋ณ€์ˆ˜ visited ์ดˆ๊ธฐํ™”๋ฅผ ์•ˆ์‹œ์ผœ์ค˜์„œ ํ‹€๋ฆฐ๊ฑฐ์˜€์Œ!!

๊ทธ๋ž˜์„œ ๊ฒฐ๊ตญ ๊ทธ๊ฑฐ๊นŒ์ง€ ๋ฐœ๊ฒฌํ•ด์„œ ๊ณ ์น˜๊ณ  ์„ฑ๊ณตํ–ˆ๋„ค์š”ใ… 

๋ฌธ์ œ ํ’€๋•Œ ๊ณผ์ •๋งˆ๋‹ค Map์„ ์ถœ๋ ฅํ•ด์„œ ๋ณด๋Š”๊ฒŒ ํฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค!

 

 

 

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

#include <iostream>
#include <queue>
using namespace std;

int n;
int map[30][30];
int dx[4] = {1,0,-1,0};
int dy[4] = {0,1,0,-1};
int visited[30][30];
queue<pair<int,int>> q;
int groupMap[30][30]; // ๊ทธ๋ฃน๋ฒˆํ˜ธ ๋งต
int groupNumCnt[900]; // ์ธ๋ฑ์Šค=๊ทธ๋ฃน๋ฒˆํ˜ธ, ๋‚ด์šฉ=๊ฐฏ์ˆ˜
int Sum = 0;
int rMap[30][30];

void findGroup(int x, int y, int groupNum){
    int tmp = map[x][y];
    int cnt=1;
    q.push({x,y});
    groupMap[x][y] = groupNum;
    visited[x][y] = 1;
    while(!q.empty()){
        pair<int,int> a = q.front();
        q.pop();
        for(int i=0;i<4;++i){
            int nx = a.first + dx[i];
            int ny = a.second + dy[i];
            if(nx<1 || ny<1 || nx>n || ny>n) continue; // ๋ฒ”์œ„ ์ฒดํฌ
            if(visited[nx][ny] == 1) continue;
            if(map[nx][ny] == tmp){
                q.push({nx,ny});
                groupMap[nx][ny] = groupNum;
                visited[nx][ny] = 1;
                cnt++;
            }
        }
    }
    groupNumCnt[groupNum] = cnt;
}

void SumCount(){ // ์ด๊ฑฐ ํƒ์ƒ‰์œผ๋กœ ํ•˜๋ฉด ์ฒดํฌ ๋ชปํ•˜๋Š” ๊ฐ’์ด ์ƒ๊ฒจ์„œ ๊ทธ๋ƒฅ ๋ฐ˜๋ณต๋ฌธ์œผ๋กœ ํ•˜๊ธฐ!!
    int nearSum = 0;
    for (int x = 1; x <= n; x++){
        for(int y = 1; y <= n; y++){
            for(int i=0;i<4;++i){ // ์–‘์˜†, ์•„๋ž˜ ์ด๋™
                int nx = x + dx[i];
                int ny = y + dy[i];
                if(nx<1 || ny<1 || nx>n || ny>n) continue; // ๋ฒ”์œ„ ์ฒดํฌ
                if (map[x][y] != map[nx][ny]){ // ์ธ์ ‘ํ•œ ๊ฐ’์ด ๋‹ค๋ฅธ ๊ฒฝ์šฐ์—
                    int num1 = map[x][y];
                    int num2 = map[nx][ny];
                    int cnt1 = groupNumCnt[groupMap[x][y]];
                    int cnt2 = groupNumCnt[groupMap[nx][ny]];
                    nearSum += (cnt1 + cnt2) * num1 * num2;
                }
            }
        }
    }
    // cout << nearSum / 2;
    Sum += (nearSum / 2);
}

void makeGroup(){
    int group_cnt = 0;
    for (int i = 1; i <= n; ++i){
        for (int j = 1; j <= n;++j){
            if(visited[i][j]==0){
                group_cnt++;
                findGroup(i, j, group_cnt);
            }
        }
    }
}

void rotateMini(int sx, int sy, int size){
    for (int i = sx; i < sx + size; ++i){
        for (int j = sy; j < sy + size; ++j){
            // ์‹œ์ž‘์ขŒํ‘œ๋ฅผ 0,0๋กœ ๋ฐ”๊พธ๊ณ  ๊ณ„์‚ฐํ•œ๋’ค ๋‹ค์‹œ ๋ณต๊ตฌ์‹œ์ผœ์„œ ์ €์žฅ
            int nx = i - sx;
            int ny = j - sy;
            int rx = ny;
            int ry = size - nx - 1;
            rMap[rx + sx][ry+sy] = map[i][j];
            // cout << i << " " << j << " - " << rx + sx << " " << ry+sy << "\n";
        }
    }
}

void rotateMap(){
    for(int i = 1; i <= n; i++){
        for(int j = 1; j <= n; j++) { // ์–˜๊ฐ€๋ฌธ์  ๋ฐ
            // ์„ธ๋กœ์ค„์€ (i, j) -> (j, i)
            if(j == (n+1) / 2)
                rMap[j][i] = map[i][j];
            // ๊ฐ€๋กœ์ค„์€ (i, j) -> (n-j+1, i)?
            else if(i == (n+1) / 2)
                rMap[n - j + 1][i] = map[i][j];
        }
    }
    int mini = (n-1) / 2;
    rotateMini(1, 1, mini); // ์‹œ์ž‘์ขŒํ‘œx,y, ์‚ฌ์ด์ฆˆ
    rotateMini(1, mini+2, mini);
    rotateMini(mini+2, 1, mini);
    rotateMini(mini+2, mini+2, mini);

    for(int i = 1; i <= n; i++){
        for(int j = 1; j <= n; j++) {
            map[i][j] = rMap[i][j];
        }
    }
    for(int i = 1; i <= n; i++){
        for(int j = 1; j <= n; j++) {
            visited[i][j] = 0;
        }
    }
}

int main() {
    cin >> n;

    for(int i=1; i<=n; ++i){
        for(int j=1;j<=n;++j) cin >> map[i][j];
    }
    for (int i = 0; i < 4; ++i){
        makeGroup();
        SumCount();
        if(i<3) rotateMap();
    }
    cout << Sum;
    return 0;
}

 

์ฝ”ํ…Œ ๊ธฐ์ถœ๋ฌธ์ œ ์ฒ˜์Œ ๋ดค์„๋•Œ๋Š” ๋‚ด๊ฐ€ ํ’€ ์ˆ˜ ์žˆ๋Š” ์ˆ˜์ค€์ด ์•„๋‹Œ ๊ฒƒ ๊ฐ™์•„์„œ ๊ฒ๋งŒ ์ž”๋œฉ ๋จน์—ˆ๋Š”๋ฐ,

๊ทธ๋ž˜๋„ ๋„ˆ๋ฌด ๋ง‰ํž๋•Œ๋Š” ํ’€์ด ์ฐธ๊ณ ํ•ด๊ฐ€๋ฉฐ ๋งค์ผ๋งค์ผ ํ’€์–ด๋ณด๋‹ˆ๊นŒ ์ž์‹ ๊ฐ์ด ์ข€ ๋ถ™๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค

์—ด์‹ฌํžˆ ํ•ด์•ผ๊ฒ ์Šต๋‹ˆ๋‹ค~~