ยซ   2025/02   ยป
์ผ ์›” ํ™” ์ˆ˜ ๋ชฉ ๊ธˆ ํ† 
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
Archives
Recent Posts
02-02 00:31

Today
Total

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

์—ฐ์˜ ๊ธฐ๋ก ๐Ÿช

[๋ฐฑ์ค€ 16724] ํ”ผ๋ฆฌ๋ถ€๋Š” ์‚ฌ๋‚˜์ด(C++) ๋ณธ๋ฌธ

Problem Solving/BOJ

[๋ฐฑ์ค€ 16724] ํ”ผ๋ฆฌ๋ถ€๋Š” ์‚ฌ๋‚˜์ด(C++)

kite707 2025. 1. 21. 19:51

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

๋ฌธ์ œ์„ค๋ช…

UDLR(์ƒํ•˜์ขŒ์šฐ)๋กœ ๊ฐ ์นธ์— ์žˆ๋Š” ์‚ฌ๋žŒ๋“ค์ด ์–ด๋–ค ๋ฐฉํ–ฅ์— ์žˆ๋Š”์ง€ ์ฃผ์–ด์ง„๋‹ค. ์‚ฌ๋žŒ๋“ค์ด ํ™”์‚ดํ‘œ๋ฅผ ๋”ฐ๋ผ ์ญ‰ ์ด๋™ํ–ˆ์„ ๋•Œ ๋ชจ๋“  ์‚ฌ๋žŒ์ด ์•ˆ์ „๊ตฌ์—ญ์œผ๋กœ ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋ ค๋ฉด ๋ช‡ ๊ฐœ์˜ ์•ˆ์ „ ๊ตฌ์—ญ์„ ๋งŒ๋“ค์–ด์•ผ ํ•˜๋Š”์ง€๋ฅผ ๋ฌป๋Š” ๋ฌธ์ œ์ด๋‹ค.

์•„์ด๋””์–ด

์ด ๋ฌธ์ œ๋Š” ๊ทธ๋ž˜ํ”„์˜ ์‚ฌ์ดํด์˜ ๊ฐœ์ˆ˜๋ฅผ ์ฐพ๋Š” ๋ฌธ์ œ์ด๋‹ค. ์‚ฌ์ดํด 1๊ฐœ๋‹น 1๊ฐœ์˜ ์•ˆ์ „๊ตฌ์—ญ์„ ๋งŒ๋“ค์–ด ์ฃผ๋ฉด ๋œ๋‹ค. ๊ทธ๋ž˜์„œ dfs๋ฅผ ํ†ตํ•ด ๊ทธ๋ž˜ํ”„๋ฅผ ์ˆœํšŒํ•˜๋ฉฐ ๋ถ€๋ชจ(์‚ฌ์ดํด์˜ ์‹œ์ž‘์ )๋ฅผ ๊ธฐ๋กํ•ด์ฃผ๊ณ , ๋งˆ์ง€๋ง‰์— ๋ถ€๋ชจ๊ฐ€ ์ด ์ข…๋ฅ˜๊ฐ€ ์žˆ๋Š”์ง€๋ฅผ ๋ฆฌํ„ดํ•ด์คฌ๋‹ค.

์•„๋ž˜์˜ ๊ฒฝ์šฐ ๋ถ€๋ชจ๊ฐ€ 2์ข…๋ฅ˜๊ฐ€ ๋‚˜์™”์œผ๋‹ˆ 2๋ฅผ ๋ฆฌํ„ดํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

์ฝ”๋“œ

์ •๋‹ต ์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค. dfs๋ฅผ ์ด์šฉํ•ด ์ˆœํšŒํ•˜๋ฉฐ ๋‹ค์Œ ๋ธ”๋Ÿญ์ด ํ˜„์žฌ์™€ ๋ถ€๋ชจ๊ฐ€ ๋‹ค๋ฅด๋‹ค๋ฉด Unionํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ๋ถ€๋ชจ๋ฅผ ํ•ฉ์ณ์คฌ๋‹ค. Unionํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ๋ถ€๋ชจ๋ฅผ ํ•ฉ์น  ๋•Œ ๋‘˜ ์ค‘ ์ž‘์€ ๊ฐ’์œผ๋กœ ํ†ต์ผํ•ด์ฃผ๊ณ  ์‹ถ์€๋ฐ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ• ๊นŒ ํ•˜๋‹ค๊ฐ€ y์ขŒํ‘œ*๊ฐ€๋กœ๊ธธ์ด+x์ขŒํ‘œ๋กœ ๊ฐ’์„ ๋น„๊ตํ•ด์คฌ๋‹ค. 

์‰ฝ๊ฒŒ ๋งํ•ด ์•„๋ž˜์™€ ๊ฐ™์ด ์นธ๋ณ„๋กœ ๋ฒˆํ˜ธ๋ฅผ ๋งค๊ธด ๊ฒƒ์ด๋‹ค. (๋ฌผ๋ก  ๋‚˜๋Š” ์ขŒ์ธก ์ƒ๋‹จ์ขŒํ‘œ๋ฅผ 1,1๋กœ ์žก์•„์„œ 5๋ถ€ํ„ฐ ์‹œ์ž‘ํ•œ๋‹ค.)

1   2   3   4
5   6   7   8
9  10 11 12
#include <iostream>
#include <vector>
#include <set>
using namespace std;

char mp[1001][1001];
int parent[2002002];

int N, M;

int findParent(int child) {
    if (parent[child] != child)
        parent[child] = findParent(parent[child]);
    return parent[child];
}

void Union(int x, int y) {
    int rootX = findParent(x);
    int rootY = findParent(y);

    rootX < rootY ? parent[rootY] = rootX : parent[rootX] = rootY;
}

void dfs(int y, int x) {
    int curChar = mp[y][x];
    int nxtY, nxtX;

    if (curChar == 'U') {
        nxtY = y - 1;
        nxtX = x;
    }
    else if (curChar == 'D') {
        nxtY = y + 1;
        nxtX = x;
    }
    else if (curChar == 'R') {
        nxtY = y;
        nxtX = x + 1;
    }
    else {
        nxtY = y;
        nxtX = x - 1;
    }
    int curIdx = y * M + x;
    int nxtIdx = nxtY * M + nxtX;

    if (findParent(curIdx) != findParent(nxtIdx)) {
        Union(curIdx, nxtIdx);
        dfs(nxtY, nxtX);
    }

}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);

    cin >> N >> M;

    for (int i = 1; i <= N; i++) {
        for (int j = 1; j <= M; j++) {
            cin >> mp[i][j];
            parent[i * M + j] = i * M + j;
        }
    }

    for (int i = 1; i <= N; i++) {
        for (int j = 1; j <= M; j++) {
            if (findParent[i * M + j] == i * M + j){ 
                dfs(i, j); 
            }
        }
    }

    set<int> st;

    for (int i = 1; i <= N; i++) {
        for (int j = 1; j <= M; j++) {
            cout<<parent[i*M+j]<<" ";
            st.insert(parent[i * M + j]);
        }
        cout<<endl;
    }

    cout << st.size();
}

 

์‹ค์ˆ˜ํ–ˆ๋˜ ๋ถ€๋ถ„

๋‚˜๋Š” ์ด ๋ฌธ์ œ๋ฅผ ์—ฌ๋Ÿฌ ๋ฒˆ ์‹œ๋„ํ•ด์„œ ๋งž์ท„๋Š”๋ฐ, ์ž๊พธ ํ‹€๋ ธ๋˜ ์ด์œ ๋Š” dfs๋ฅผ ํ• ์ง€ ๋ง์ง€ ํŒ๋ณ„ํ•  ๋•Œ ์ž๊ธฐ ์ž์‹ ์˜ ๋ถ€๋ชจ๋ฅผ parent๋ฐฐ์—ด์„ ํ†ตํ•ด ํ™•์ธํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ด์—ˆ๋‹ค. (findParentํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด์•ผ ํ•œ๋‹ค.)

findParentํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ๋ถ€๋ชจ๋ฅผ ํ™•์ธํ•˜์ง€ ์•Š์œผ๋ฉด parent๋ฐฐ์—ด์ด ์ œ๋Œ€๋กœ ์ดˆ๊ธฐํ™” ๋˜์ง€ ์•Š๋Š”๋‹ค. ์ด๋ ‡๊ฒŒ ์ž˜๋ชป ์งœ๋ฉด ์•„๋ž˜ ์˜ˆ์ œ๋ฅผ ํ†ต๊ณผํ•  ์ˆ˜  ์—†๋‹ค.

์ž…๋ ฅ
4 4
RRDD
RRUU
UULL
RRUU

์ •๋‹ต: 2
์ถœ๋ ฅ: 3

ํ‹€๋ ธ๋˜์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค. (mainํ•จ์ˆ˜๋งŒ ๋ฐœ์ทŒ)

...

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);

    cin >> N >> M;

    for (int i = 1; i <= N; i++) {
        for (int j = 1; j <= M; j++) {
            cin >> mp[i][j];
            parent[i * M + j] = i * M + j;
        }
    }

    for (int i = 1; i <= N; i++) {
        for (int j = 1; j <= M; j++) {
            if (parent[i * M + j] == i * M + j){ //์ด๋ถ€๋ถ„์„ findParent(i*M+j)๋กœ ๊ณ ์ณ์•ผํ•œ๋‹ค.
                dfs(i, j);
            }
        }
    }

    set<int> st;

    for (int i = 1; i <= N; i++) {
        for (int j = 1; j <= M; j++) {
            st.insert(parent[i * M + j]);
        }
    }

    cout << st.size();
}

 

parent๋ฐฐ์—ด์„ ์ด์šฉํ•ด ๋ถ€๋ชจ๋ฅผ ์ฐพ์•˜์„ ๋•Œ์™€ findParentํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ๋ถ€๋ชจ๋ฅผ ์ฐพ์•˜์„ ๋•Œ์˜ ์ฐจ์ด์ ์„ ์œ„ ๋ฐ˜๋ก€๋ฅผ ์ด์šฉํ•ด ํ™•์ธํ•ด๋ณด์•˜๋‹ค. 

์ขŒ์ธก์ด parent๋ฐฐ์—ด, ์šฐ์ธก์ด findParentํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ์˜ parent๋ฐฐ์—ด ์ตœ์ข… ๊ฐ’์ด๋‹ค.

์ด๋Ÿฐ ์ฐจ์ด๋Š” 18๋ฒˆ ๋ธ”๋Ÿญ(๋นจ๊ฐ„ ๋™๊ทธ๋ผ๋ฏธ)์— ๋„๋‹ฌํ–ˆ์„ ๋•Œ ๋ฐœ์ƒํ•œ๋‹ค.

18๋ฒˆ ๋ธ”๋Ÿญ์„ ๋ฐฉ๋ฌธํ–ˆ์„ ๋•Œ findParentํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ํ•ด๋‹น ๋ธ”๋Ÿญ์˜ ๊ฐ’์ด 5๋กœ ๋ฐ”๋€Œ๊ฒŒ ๋œ๋‹ค. (17์˜ ๋ถ€๋ชจ->5์ด๊ธฐ ๋•Œ๋ฌธ) ๊ทธ๋Ÿฐ๋ฐ ๋‹จ์ˆœํžˆ parent๋ฐฐ์—ด์„ ์ด์šฉํ•ด ๊ฐ’์„ ํ™•์ธํ•˜๋ฉด 18๋ฒˆ ๋ธ”๋Ÿญ์˜ ๋ถ€๋ชจ๊ฐ’์ด ๊ฐฑ์‹ ์ด ์•ˆ๋˜์–ด ๊ฒฐ๊ณผ์ ์œผ๋กœ ํ‹€๋ฆฐ ๋‹ต์ด ๋„์ถœ๋œ๋‹ค.

์•„๋ž˜ ๊ทธ๋ฆผ์„ ๋ณด๋ฉด 18๋ฒˆ ๋ธ”๋Ÿญ์„ ๋ฐฉ๋ฌธํ•  ๋•Œ ๊นŒ์ง€๋Š” ๋ถ€๋ชจ๊ฐ€ 17์ด์—ˆ๋Š”๋ฐ 19๋ฒˆ ๋ธ”๋Ÿญ์„ ๋ฐฉ๋ฌธํ•  ๋•Œ๋Š” 5๋กœ ๋ถ€๋ชจ๊ฐ€ ๊ฐฑ์‹ ๋œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

์ •๋‹ต ์ฝ”๋“œ ์‹คํ–‰ ์‹œ parent๋ฐฐ์—ด

์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋  ๋•Œ ์ค‘๊ฐ„์ค‘๊ฐ„ parent๋ฐฐ์—ด์„ ํ™•์ธํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

#include <iostream>
#include <vector>
#include <set>
using namespace std;

char mp[1001][1001];
int parent[2002002];

int N, M;

int findParent(int child) {
    if (parent[child] != child)
        parent[child] = findParent(parent[child]);
    return parent[child];
}

void Union(int x, int y) {
    int rootX = findParent(x);
    int rootY = findParent(y);

    rootX < rootY ? parent[rootY] = rootX : parent[rootX] = rootY;
}

void dfs(int y, int x) {
    int curChar = mp[y][x];
    int nxtY, nxtX;

    if (curChar == 'U') {
        nxtY = y - 1;
        nxtX = x;
    }
    else if (curChar == 'D') {
        nxtY = y + 1;
        nxtX = x;
    }
    else if (curChar == 'R') {
        nxtY = y;
        nxtX = x + 1;
    }
    else {
        nxtY = y;
        nxtX = x - 1;
    }
    int curIdx = y * M + x;
    int nxtIdx = nxtY * M + nxtX;

    if (findParent(curIdx) != findParent(nxtIdx)) {
        Union(curIdx, nxtIdx);
        dfs(nxtY, nxtX);
    }

}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);

    cin >> N >> M;

    for (int i = 1; i <= N; i++) {
        for (int j = 1; j <= M; j++) {
            cin >> mp[i][j];
            parent[i * M + j] = i * M + j;
        }
    }

    for (int i = 1; i <= N; i++) {
        for (int j = 1; j <= M; j++) {
            cout<<"before: "<<i<<" "<<j<<" "<<i*M+j<<endl;
            for (int i = 1; i <= N; i++) {
                for (int j = 1; j <= M; j++) {
                    cout<<parent[i*M+j]<<" ";
                }
                cout<<endl;
            }
            if (parent[i * M + j] == i * M + j){ //์ด๋ถ€๋ถ„์„ findParent(i*M+j)๋กœ ํ•ด์•ผํ•œ๋‹ค.
                cout<<"after\\n";
                for (int i = 1; i <= N; i++) {
                    for (int j = 1; j <= M; j++) {
                        cout<<parent[i*M+j]<<" ";
                    }
                    cout<<endl;
                }
                dfs(i, j);

            }
        }
    }

    set<int> st;
    
    cout<<"final\\n";
    for (int i = 1; i <= N; i++) {
        for (int j = 1; j <= M; j++) {
            cout<<parent[i*M+j]<<" ";
            st.insert(parent[i * M + j]);
        }
        cout<<endl;
    }

    cout << st.size();
}