๊ด€๋ฆฌ ๋ฉ”๋‰ด

๐˜š๐˜ญ๐˜ฐ๐˜ธ ๐˜ฃ๐˜ถ๐˜ต ๐˜ด๐˜ต๐˜ฆ๐˜ข๐˜ฅ๐˜บ

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค] [PCCP ๊ธฐ์ถœ๋ฌธ์ œ] 2๋ฒˆ / ์„์œ  ์‹œ์ถ” - C++ ๋ณธ๋ฌธ

์ฝ”๋”ฉํ…Œ์ŠคํŠธ ์ค€๋น„/ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค] [PCCP ๊ธฐ์ถœ๋ฌธ์ œ] 2๋ฒˆ / ์„์œ  ์‹œ์ถ” - C++

.23 2025. 3. 17. 21:55
๋ฌธ์ œ

๐Ÿ”— ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค - [PCCP ๊ธฐ์ถœ๋ฌธ์ œ] 2๋ฒˆ / ์„์œ  ์‹œ์ถ”

[๋ณธ ๋ฌธ์ œ๋Š” ์ •ํ™•์„ฑ๊ณผ ํšจ์œจ์„ฑ ํ…Œ์ŠคํŠธ ๊ฐ๊ฐ ์ ์ˆ˜๊ฐ€ ์žˆ๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.]

์„ธ๋กœ๊ธธ์ด๊ฐ€ n ๊ฐ€๋กœ๊ธธ์ด๊ฐ€ m์ธ ๊ฒฉ์ž ๋ชจ์–‘์˜ ๋•… ์†์—์„œ ์„์œ ๊ฐ€ ๋ฐœ๊ฒฌ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์„์œ ๋Š” ์—ฌ๋Ÿฌ ๋ฉ์–ด๋ฆฌ๋กœ ๋‚˜๋ˆ„์–ด ๋ฌปํ˜€์žˆ์Šต๋‹ˆ๋‹ค. ๋‹น์‹ ์ด ์‹œ์ถ”๊ด€์„ ์ˆ˜์ง์œผ๋กœ ๋‹จ ํ•˜๋‚˜๋งŒ ๋šซ์„ ์ˆ˜ ์žˆ์„ ๋•Œ, ๊ฐ€์žฅ ๋งŽ์€ ์„์œ ๋ฅผ ๋ฝ‘์„ ์ˆ˜ ์žˆ๋Š” ์‹œ์ถ”๊ด€์˜ ์œ„์น˜๋ฅผ ์ฐพ์œผ๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์‹œ์ถ”๊ด€์€ ์—ด ํ•˜๋‚˜๋ฅผ ๊ด€ํ†ตํ•˜๋Š” ํ˜•ํƒœ์—ฌ์•ผ ํ•˜๋ฉฐ, ์—ด๊ณผ ์—ด ์‚ฌ์ด์— ์‹œ์ถ”๊ด€์„ ๋šซ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ๊ฐ€๋กœ๊ฐ€ 8, ์„ธ๋กœ๊ฐ€ 5์ธ ๊ฒฉ์ž ๋ชจ์–‘์˜ ๋•… ์†์— ์œ„ ๊ทธ๋ฆผ์ฒ˜๋Ÿผ ์„์œ ๊ฐ€ ๋ฐœ๊ฒฌ๋˜์—ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์ƒ, ํ•˜, ์ขŒ, ์šฐ๋กœ ์—ฐ๊ฒฐ๋œ ์„์œ ๋Š” ํ•˜๋‚˜์˜ ๋ฉ์–ด๋ฆฌ์ด๋ฉฐ, ์„์œ  ๋ฉ์–ด๋ฆฌ์˜ ํฌ๊ธฐ๋Š” ๋ฉ์–ด๋ฆฌ์— ํฌํ•จ๋œ ์นธ์˜ ์ˆ˜์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆผ์—์„œ ์„์œ  ๋ฉ์–ด๋ฆฌ์˜ ํฌ๊ธฐ๋Š” ์™ผ์ชฝ๋ถ€ํ„ฐ 8, 7, 2์ž…๋‹ˆ๋‹ค.

์‹œ์ถ”๊ด€์€ ์œ„ ๊ทธ๋ฆผ์ฒ˜๋Ÿผ ์„ค์น˜ํ•œ ์œ„์น˜ ์•„๋ž˜๋กœ ๋๊นŒ์ง€ ๋ป—์–ด๋‚˜๊ฐ‘๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์‹œ์ถ”๊ด€์ด ์„์œ  ๋ฉ์–ด๋ฆฌ์˜ ์ผ๋ถ€๋ฅผ ์ง€๋‚˜๋ฉด ํ•ด๋‹น ๋ฉ์–ด๋ฆฌ์— ์†ํ•œ ๋ชจ๋“  ์„์œ ๋ฅผ ๋ฝ‘์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‹œ์ถ”๊ด€์ด ๋ฝ‘์„ ์ˆ˜ ์žˆ๋Š” ์„์œ ๋Ÿ‰์€ ์‹œ์ถ”๊ด€์ด ์ง€๋‚˜๋Š” ์„์œ  ๋ฉ์–ด๋ฆฌ๋“ค์˜ ํฌ๊ธฐ๋ฅผ ๋ชจ๋‘ ํ•ฉํ•œ ๊ฐ’์ž…๋‹ˆ๋‹ค. ์‹œ์ถ”๊ด€์„ ์„ค์น˜ํ•œ ์œ„์น˜์— ๋”ฐ๋ผ ๋ฝ‘์„ ์ˆ˜ ์žˆ๋Š” ์„์œ ๋Ÿ‰์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์˜ค๋ฅธ์ชฝ ๊ทธ๋ฆผ์ฒ˜๋Ÿผ 7๋ฒˆ ์—ด์— ์‹œ์ถ”๊ด€์„ ์„ค์น˜ํ•˜๋ฉด ํฌ๊ธฐ๊ฐ€ 7, 2์ธ ๋ฉ์–ด๋ฆฌ์˜ ์„์œ ๋ฅผ ์–ป์–ด ๋ฝ‘์„ ์ˆ˜ ์žˆ๋Š” ์„์œ ๋Ÿ‰์ด 9๋กœ ๊ฐ€์žฅ ๋งŽ์Šต๋‹ˆ๋‹ค.

์„์œ ๊ฐ€ ๋ฌปํžŒ ๋•…๊ณผ ์„์œ  ๋ฉ์–ด๋ฆฌ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” 2์ฐจ์› ์ •์ˆ˜ ๋ฐฐ์—ด land๊ฐ€ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ฃผ์–ด์ง‘๋‹ˆ๋‹ค. ์ด๋•Œ ์‹œ์ถ”๊ด€ ํ•˜๋‚˜๋ฅผ ์„ค์น˜ํ•ด ๋ฝ‘์„ ์ˆ˜ ์žˆ๋Š” ๊ฐ€์žฅ ๋งŽ์€ ์„์œ ๋Ÿ‰์„ return ํ•˜๋„๋ก solution ํ•จ์ˆ˜๋ฅผ ์™„์„ฑํ•ด ์ฃผ์„ธ์š”.

 

์ œํ•œ์‚ฌํ•ญ

์ œํ•œ์‚ฌํ•ญ

1 โ‰ค land์˜ ๊ธธ์ด = ๋•…์˜ ์„ธ๋กœ๊ธธ์ด = n โ‰ค 500

    ยท 1 โ‰ค land[i]์˜ ๊ธธ์ด = ๋•…์˜ ๊ฐ€๋กœ๊ธธ์ด = m โ‰ค 500

    ยท land[i][j]๋Š” i+1ํ–‰ j+1์—ด ๋•…์˜ ์ •๋ณด๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

    ยท land[i][j]๋Š” 0 ๋˜๋Š” 1์ž…๋‹ˆ๋‹ค.

    ยท land[i][j]๊ฐ€ 0์ด๋ฉด ๋นˆ ๋•…์„, 1์ด๋ฉด ์„์œ ๊ฐ€ ์žˆ๋Š” ๋•…์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

์ •ํ™•์„ฑ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ์ œํ•œ์‚ฌํ•ญ

1 โ‰ค land์˜ ๊ธธ์ด = ๋•…์˜ ์„ธ๋กœ๊ธธ์ด = n โ‰ค 100

    ยท 1 โ‰ค land[i]์˜ ๊ธธ์ด = ๋•…์˜ ๊ฐ€๋กœ๊ธธ์ด = m โ‰ค 100

ํšจ์œจ์„ฑ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ์ œํ•œ์‚ฌํ•ญ

์ฃผ์–ด์ง„ ์กฐ๊ฑด ์™ธ ์ถ”๊ฐ€ ์ œํ•œ์‚ฌํ•ญ ์—†์Šต๋‹ˆ๋‹ค.

 

์ž…์ถœ๋ ฅ ์˜ˆ

 


๊ฐ„๋‹จํ•œ? ๊ทธ๋Ÿฌ๋‚˜ ์ •ํ™•์„ฑ๊ณผ ํšจ์œจ์„ฑ์„ ๋ชจ๋‘ ๊ณ ๋ คํ–ˆ์„ ๋•Œ ์ƒ๊ฐํ•ด์ค˜์•ผ ํ•  ๋ถ€๋ถ„์ด ๋งŽ์•„์„œ ๊ธฐ๋กํ•ด๋†“๋Š” ๋ฌธ์ œ.

์ฒ˜์Œ ์•„์ด๋””์–ด๋Š” ๋‹น์—ฐํžˆ ๊ฐ ์—ด๋ณ„ BFS ํƒ์ƒ‰์„ ์ง„ํ–‰ ํ›„ ์ตœ๋Œ€ ์˜์—ญ์„ ๋น„๊ตํ•˜๋ฉด ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋‚  ๊ฒƒ์ด ๋ป”ํ•˜๋‹ˆ,

 

1. 1ํšŒ BFS ํƒ์ƒ‰ํ•˜์—ฌ ์ธ์ ‘ํ•œ ์„์œ  ๋ฉ์–ด๋ฆฌ๋Š” ๊ทธ๋ฃน๋ณ„๋กœ ๋ฌถ๋Š”๋‹ค.

2. ๋ฉ์–ด๋ฆฌ ๋ณ„ ํฌ๊ธฐ๋Š” map์„ ํ†ตํ•ด ์ €์žฅํ•ด์ค€๋‹ค.

3. ์—ด๋ณ„ ํƒ์ƒ‰์„ ์ง„ํ–‰ํ•˜๋ฉด์„œ ๊ทธ๋ฃน์„ set์œผ๋กœ ์„ธ์–ด ์ค‘๋ณต์„ ์—†์•ค ํ›„ ๋”ํ•œ ํฌ๊ธฐ๋ฅผ ๋น„๊ตํ•œ๋‹ค.

 

์˜€๋Š”๋ฐ, ๊ณ„์† ํšจ์œจ์„ฑ ๋ถ€๋ถ„์—์„œ ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋‚˜๋”๋ผ(์‚ฌ์‹ค ์ •ํ™•๋„๋งŒ land ํฌ๊ธฐ๊ฐ€ 100์ด๊ณ  ํšจ์œจ์„ฑ์€ 500์ธ๊ฑธ ์•ˆ๋ด์„œ segmentation fault๊ฐ€ ๋”๋งŽ์ด ๋œธ)

 

๊ทธ๋ž˜์„œ ๊ณ„์† ํ•ด๊ฒฐ์ฑ…์„ ์ฐพ๋‹ค๊ฐ€ ๋ฐฐ์šด ์ ๋“ค ์ •๋ฆฌํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

 

Lessons learned

- C++์˜ map๊ณผ set์˜ ์—ฐ์‚ฐ ์†๋„๋Š” log N โ†’ map<int, int>๋กœ ์“ธ๊ฑฐ๋ฉด ์ฐจ๋ผ๋ฆฌ ํ•„์š”ํ•œ ์ž๋ฃŒ๊ตฌ์กฐ์˜ ํฌ๊ธฐ๋งŒํผ ๋ฏธ๋ฆฌ ์ •์˜ํ•ด๋†“๊ณ (์—ฌ๊ธฐ์„œ๋Š” ๊ฐ๊ฐ R * C + 1, group_id + 1) ์ ‘๊ทผํ•˜๋ฉด O(1)๋กœ ์‹œ๊ฐ„ ๋‹จ์ถ• ๊ฐ€๋Šฅ

- ์ฝ๊ธฐ๋งŒ ํ•„์š”ํ•œ ๋ฐฐ์—ด(vector)์„ ํ•จ์ˆ˜์˜ parameter๋กœ ๋„˜๊ฒจ์ค„๊ฑฐ๋ฉด, ์ฐจ๋ผ๋ฆฌ ๊ฐ’์„ ๋ณต์‚ฌํ•˜๋Š” ๋ฐฉ์‹(call-by-value) ๋ณด๋‹ค๋Š” '์ฐธ์กฐ ๊ธฐ๋ฐ˜' ์ „๋‹ฌ(call-by-reference)๋กœ ์ˆ˜์ •

vector<vector<int> > land โ†’ const vector<vector<int>>& land

 

์‹ค์ œ๋กœ ์ฒซ๋ฒˆ์งธ๊ฑฐ๋งŒ ์ˆ˜์ •ํ•˜๋ฉด ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋Š”๋ฐ,

์ฐธ์กฐ ๋ฐฉ์‹์œผ๋กœ ๋ฐ”๊ฟ”์ฃผ๋‹ˆ๊นŒ ๋ฐ”๋กœ ํ†ต๊ณผํ–ˆ๋‹ค..ใ…œใ…œ

 

๊ณต๋ถ€์˜ ๋์ด์—†๋‹ค..

 

์ฝ”๋“œ
#include <string>
#include <vector>
#include <queue>
#define MAX 501

using namespace std;

bool visited[MAX][MAX] = { false };
int graph[MAX][MAX] = { 0 };
int dy[] = { 1, -1, 0, 0 };
int dx[] = { 0, 0, 1, -1 };

int BFS(int start_r, int start_c, int group_id, vector<vector<int> >& land) {
    queue<pair<int, int> > q;
    int r = land.size();
    int c = land[0].size();
    
    int group_cnt = 1;
    visited[start_r][start_c] = true;

    q.push(make_pair(start_r, start_c));

    while(!q.empty()) {
        int nr = q.front().first;
        int nc = q.front().second;
        graph[nr][nc] = group_id;
        
        q.pop();

        for(int i = 0; i < 4; i++) {
            if(nr + dy[i] < 0 || nr + dy[i] >= r || nc + dx[i] < 0 || nc + dx[i] >= c) continue;
            if(!visited[nr + dy[i]][nc + dx[i]] && land[nr + dy[i]][nc + dx[i]] == 1) {
                visited[nr + dy[i]][nc + dx[i]] = true;
                q.push(make_pair(nr + dy[i], nc + dx[i]));
                group_cnt++;
            }
        }
    }
    
    return group_cnt;
}

int solution(vector<vector<int>> land) {
    int answer = 0;
    int r = land.size();
    int c = land[0].size();
    vector<int> group(r * c + 1, 0);
    
    int group_id = 0;
    for(int i = 0; i < r; i++) {
        for(int j = 0; j < c; j++) {
            if(land[i][j] == 1 && !visited[i][j]) {
                group_id++;
                group[group_id] = BFS(i, j, group_id, land);
            }
        }
    }

    int max = 0;
    for(int j = 0; j < c; j++) {
        int count = 0;
        vector<bool> group_visited(group_id + 1, false);

        for(int i = 0; i < r; i++) {
            int gid = graph[i][j];
            if(gid != 0 && !group_visited[gid]) {
                count += group[gid];
                group_visited[gid] = true;
            }
        }

        max = max < count ? count : max;
    }

    return max;
}
Comments