ยซ   2025/04   ยป
์ผ ์›” ํ™” ์ˆ˜ ๋ชฉ ๊ธˆ ํ† 
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 29 30
Archives
Recent Posts
04-12 14:44

Today
Total

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

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

[C++ ์•Œ๊ณ ๋ฆฌ์ฆ˜] ํ”Œ๋กœ์ด๋“œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ณธ๋ฌธ

Computer Science/์ž๋ฃŒ๊ตฌ์กฐ & ์•Œ๊ณ ๋ฆฌ์ฆ˜

[C++ ์•Œ๊ณ ๋ฆฌ์ฆ˜] ํ”Œ๋กœ์ด๋“œ ์•Œ๊ณ ๋ฆฌ์ฆ˜

kite707 2025. 2. 25. 23:24

์ด ๊ธ€์€ ํ”Œ๋กœ์ด๋“œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํ•™์Šตํ•˜๋ฉฐ ์ด๋ ‡๊ฒŒ ์งœ๋ฉด ์™œ ์•ˆ๋ ๊นŒ?๋ฅผ ๊ณ ๋ฏผํ•œ ๊ณผ์ •์„ ์ž‘์„ฑํ•œ ๊ธ€์ž…๋‹ˆ๋‹ค.
ํ”Œ๋กœ์ด๋“œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ž์ฒด๊ฐ€ ์ฒ˜์Œ์ด๋ผ๋ฉด ์•„๋ž˜ ๋งํฌ์—์„œ ํ”Œ๋กœ์ด๋“œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ๋Œ€ํ•œ ๊ฐœ๋…์„ ์ตํžŒ ํ›„ ๊ธ€์„ ์ฝ์œผ์‹œ๋Š” ๊ฒƒ์„ ์ถ”์ฒœํ•ฉ๋‹ˆ๋‹ค.

https://blog.encrypted.gg/1035

 

[์‹ค์ „ ์•Œ๊ณ ๋ฆฌ์ฆ˜] 0x1C๊ฐ• - ํ”Œ๋กœ์ด๋“œ ์•Œ๊ณ ๋ฆฌ์ฆ˜

์•ˆ๋…•ํ•˜์„ธ์š”, ์ด๋ฒˆ์—๋Š” ํ”Œ๋กœ์ด๋“œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋‹ค๋ฃจ๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด์ œ ์ตœ๋‹จ๊ฒฝ๋กœ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ธ ํ”Œ๋กœ์ด๋“œ, ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜๋งŒ ๋‹ค๋ฃจ๊ณ  ๋‚˜๋ฉด ๋‚˜๋ฆ„ ๊ธธ์—ˆ๋˜ ๊ทธ๋ž˜ํ”„ ํŒŒํŠธ๊ฐ€ ๋๋‚ฉ๋‹ˆ๋‹ค. ๋ชฉ์ฐจ๋Š” ๋ˆˆ์œผ๋กœ ํ•œ ๋ฒˆ

blog.encrypted.gg

 

์ตœ๋‹จ๊ฑฐ๋ฆฌ

ํ”Œ๋กœ์ด๋“œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๊ทธ๋ž˜ํ”„์˜ ๋ชจ๋“  ์ •์ ๊ฐ„์˜ ์ตœ๋‹จ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค. ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๊ฐ„๋‹จํ•œ ํŽธ์ด๋‹ค.

  1. NxNํฌ๊ธฐ์˜ ๋ฐฐ์—ด์„ ํฐ ๊ฐ’(INF)์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค.
  2. ๊ฐ ์ •์ ๊ฐ„์˜ ๊ฑฐ๋ฆฌ๋ฅผ ์ž…๋ ฅ๋ฐ›์œผ๋ฉฐ ๋ฐฐ์—ด์„ ์ฑ„์›Œ๋‚˜๊ฐ„๋‹ค.
  3. ๋ชจ๋“  ์ •์ ์— ๋Œ€ํ•ด ๋‹ค๋ฅธ ์ •์ ์„ ๊ฑฐ์ณ์„œ ๊ฐ€๋Š” ๊ฒฝ์šฐ๋ฅผ ๊ฒ€์‚ฌํ•œ๋‹ค. ๋งŒ์ผ ๋‹ค๋ฅธ ์ •์ ์„ ๊ฑฐ์ณ๊ฐ€๊ฒƒ์ด ์ตœ๋‹จ๊ฑฐ๋ฆฌ๋ผ๋ฉด ๊ฐ’์„ ๊ฐฑ์‹ ํ•œ๋‹ค.

๊ทธ๋ž˜์„œ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ์‹์ด๋‹ค.

#include <iostream>
#include <vector>
#include <algorithm>
#define INF 100000001; //์ •์ ์ด ์ตœ๋Œ€ 100๊ฐœ๊ณ  ์ •์ ๊ฐ„ ์ตœ๋Œ€ ๊ธธ์ด๋Š” 100000์ด๋‹ˆ 100000*(100-1)๋ณด๋‹ค ํฐ ๊ฐ’์œผ๋กœ ์„ค์ •
using namespace std;

int arr[101][101];


int main(){
    int N,M;

    cin>>N>>M;

    for(int i=1;i<=N;i+)fill(&arr[0],&arr[0]+N,INF);

    int a,b,cost;
    while(M--){
        cin>>a>>b>>cost;
        arr[a][b]=min(arr[a][b],c);
    }

    for(int k=1;k<=N;k++){
        for(int i=1;i<=N;i++){
            for(int j=1;j<=N;j++){
                arr[i][j]=min(arr[i][j],arr[i][k]+arr[k][j]); //i-j๋กœ ์ด๋™ํ•˜๋Š” ๊ฒƒ๊ณผ i-k,k-j๋กœ ์ด๋™ํ•˜๋Š” ๊ฑฐ๋ฆฌ ์ค‘ ์ž‘์€ ๊ฐ’
            }
        }
    }
    for(int i=1;i<=N;i++){
        for(int j=1;j<=N;j++){
	        if(arr[i][j]==INF)cout<<"X ";
            else cout<<arr[i][j]<<" ";
        }
        cout<<"\n";
    }
}

๋‚˜๋Š” ์ฒ˜์Œ์— ๊ฐœ๋…๋งŒ ๋ณด๊ณ  ์ง์ ‘ ์ฝ”๋“œ๋ฅผ ์งœ๋ดค๋Š”๋ฐ ์ง€๊ธˆ์ฒ˜๋Ÿผ k i j ์ˆœ์œผ๋กœ ๋ฐ˜๋ณต๋ฌธ์„ ์ง  ๊ฒƒ์ด ์•„๋‹ˆ๋ผ i j k์ˆœ์œผ๋กœ ๋ฐ˜๋ณต๋ฌธ์„ ์งฐ์—ˆ๋‹ค. ๋‹น์—ฐํžˆ ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๊ฒฐ๊ณผ๊ฐ€ ๋‹ค๋ฅด๊ฒŒ ๋‚˜์˜ค๋Š”๋ฐ, ๋ฐ˜๋ก€๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค. 

5
6
1 2 2
2 4 2
1 4 1
3 4 1
4 5 3
5 1 7

๊ทธ๋ฆผ์ƒ์—์„œ๋Š” 2-4-5-1์„ ํ†ตํ•ด 2์—์„œ 1๋กœ ๋„๋‹ฌํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์œ„์™€ ๊ฐ™์ด ๋ฐ˜๋ณต๋ฌธ์„ ๋Œ๋ฆฌ๋ฉด 2์—์„œ 1์— ๊ฐˆ ์ˆ˜ ์—†๋‹ค๋ฉฐ X๊ฐ€ ์ถœ๋ ฅ๋œ๋‹ค. ๊ทธ ์ด์œ ๋Š” 2์—์„œ 5๋กœ ๊ฐ€๋Š” ๊ฒฝ๋กœ๊ฐ’ 5๋Š” k=4, i=2, j=5์ผ๋•Œ ์—…๋ฐ์ดํŠธ ๋˜๊ธฐ ๋•Œ๋ฌธ์—, 2์—์„œ 1๋กœ ๊ฐ€๋Š” ๊ฒฝ๋กœ๊ฐ€ ์—…๋ฐ์ดํŠธ ๋˜์–ด์•ผํ•˜๋Š” ์‹œ์ ์ธ k=5, i=2, j=1์ผ ๋•Œ๋Š” arr[2][5]๊ฐ’์ด INF์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ทธ๋ ‡๊ธฐ์— 2์—์„œ 1๋กœ ๋„๋‹ฌํ•  ์ˆ˜ ์—†๋‹ค๊ณ  ํŒ๋‹จํ•ด๋ฒ„๋ฆฐ๋‹ค.

๊ฒฝ๋กœ์ถ”์ 

๊ทธ๋ฆฌ๊ณ  ๊ฒฝ๋กœ๋ฅผ ์ถ”์ ํ•˜๋Š” ์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

#include <iostream>
#include <vector>
#include <algorithm>
#define INF 100000001; //์ •์ ์ด ์ตœ๋Œ€ 100๊ฐœ๊ณ  ์ •์ ๊ฐ„ ์ตœ๋Œ€ ๊ธธ์ด๋Š” 100000์ด๋‹ˆ 100000*(100-1)๋ณด๋‹ค ํฐ ๊ฐ’์œผ๋กœ ์„ค์ •
using namespace std;

int arr[101][101];
int nxt[101][101]; //์ถ”๊ฐ€๋œ ๋ถ€๋ถ„1


int main(){
    int N,M;

    cin>>N>>M;

    for(int i=1;i<=N;i+)fill(&arr[0],&arr[0]+N,INF);

    int a,b,cost;
    while(M--){
        cin>>a>>b>>cost;
        arr[a][b]=min(arr[a][b],c);
        nxt[a][b]=b; //์ถ”๊ฐ€๋œ ๋ถ€๋ถ„2
    }

    for(int k=1;k<=N;k++){
        for(int i=1;i<=N;i++){
            for(int j=1;j<=N;j++){
                if(arr[i][j]>arr[i][k]+arr[k][j]){
                    arr[i][j]=arr[i][k]+arr[k][j];
                    nxt[i][j]=nxt[i][k]; //์ถ”๊ฐ€๋œ ๋ถ€๋ถ„3
                }
            }
        }
    }
    for(int i=1;i<=N;i++){
        for(int j=1;j<=N;j++){
	        if(arr[i][j]==INF)cout<<"X ";
            else cout<<arr[i][j]<<" ";
        }
        cout<<"\n";
    }

    cout<<"๊ฒฝ๋กœ ์ถœ๋ ฅ\n"
    for(int i=1;i<=N;i++){
        for(int j=1;j<=N;j++){
            if(arr[i][j]==0||arr[i][j]==INF)cout<<"0 ";
            vector<int> path;
            int next=i;
            while(next!=j){
                path.push_back(next);
                next=nxt[next][j];
            }
            path.push_back(next);
            
            cout<<path.size()<<" ";
            for(int i=0;i<path.size();i++){
                cout<<path[i]<<" ";
            }
        }
        cout<<"\n";
    }
}

๋‚˜๋Š” ์ถ”๊ฐ€๋œ ๋ถ€๋ถ„ 3์˜ nxt๋ฐฐ์—ด์„ ๊ฐฑ์‹ ํ•˜๋Š” ๋ถ€๋ถ„์„ ์ฒ˜์Œ์— k๋กœ ์งœ๊ณ  ์™œ ๋ฌธ์ œ๊ฐ€ ๋˜๋Š”์ง€ ๋ชฐ๋ž์—ˆ๋‹ค.

nxt[i][j]=nxt[i][k]; //์ถ”๊ฐ€๋œ ๋ถ€๋ถ„3

nxt[i][j]=k; //์ž˜๋ชป์งฐ๋˜ ๋ถ€๋ถ„

์ค‘๊ฐ„์— ๊ฑฐ์ณ๊ฐ€๋Š” ๋…ธ๋“œ๊ฐ€ 2๊ฐœ ์ด์ƒ๋ถ€ํ„ฐ๋Š” nxt๋ฐฐ์—ด์„ k๋กœ ๊ฐฑ์‹ ํ–ˆ์„ ๋•Œ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธด๋‹ค. 

์˜ˆ๋ฅผ ๋“ค์–ด ์•„๋ž˜์™€ ๊ฐ™์€ ๊ทธ๋ž˜ํ”„๊ฐ€ ์žˆ๋‹ค๊ณ  ํ•˜์ž.

๊ทธ๋Ÿฌ๋ฉด ์šฐ๋ฆฌ๊ฐ€ ๊ธฐ๋Œ€ํ•˜๋Š” nxtํ‘œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ์ƒ๊ฒผ์„ ๊ฒƒ์ด๋‹ค.

ํ•˜์ง€๋งŒ nxt๋ฅผ ๊ฐฑ์‹ ํ•  ๋•Œ k๋กœ ํ•œ๋‹ค๋ฉด nxtํ‘œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ๋‚˜์˜จ๋‹ค.

์ด ์ด์œ ๋ฅผ ์•Œ๊ธฐ ์œ„ํ•ด์„œ๋Š” ํ”Œ๋กœ์ด๋“œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๊ณ  ํ‘œ๊ฐ€ ์–ด๋–ป๊ฒŒ ๊ฐฑ์‹ ๋˜๋Š”์ง€๋ฅผ ์‚ดํŽด๋ด์•ผ ํ•œ๋‹ค.

๋จผ์ € 1-3์œผ๋กœ ๊ฐ€๋Š” ๊ฐ’์€ ์ตœ์ดˆ์—๋Š” INF๋กœ ๊ธฐ๋ก๋˜์–ด ์žˆ์„ ๊ฒƒ์ด๋‹ค. ์ง์ ‘์ ์œผ๋กœ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ด ๊ฐ’์ด ๊ฐฑ์‹ ๋˜๋Š” ๊ฒƒ์€ ์ค‘๊ฐ„๋…ธ๋“œ(k) 2, ์ถœ๋ฐœ๋…ธ๋“œ(i) 1, ๋„์ฐฉ๋…ธ๋“œ(j) 3์ผ๋•Œ ์ผ ๊ฒƒ์ด๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด 1-4๋กœ ๊ฐ€๋Š” ๊ฒฝ๋กœ๋Š” ์–ธ์ œ ๊ฐฑ์‹ ๋ ๊นŒ? 1-4๋กœ ๊ฐ€๋Š” ๊ฒฝ๋กœ๋Š” ์ค‘๊ฐ„๋…ธ๋“œ(k) 3, ์ถœ๋ฐœ๋…ธ๋“œ(i) 1, ๋„์ฐฉ๋…ธ๋“œ(j) 4์ผ๋•Œ ๊ฐฑ์‹ ๋œ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ nxt๋ฐฐ์—ด์€ 1-4๋กœ ์ตœ๋‹จ๊ฒฝ๋กœ๋กœ ๊ฐ€๊ธฐ ์œ„ํ•ด ๋‹ค์Œ์œผ๋กœ ๊ฐ€์•ผ ํ•  ๋…ธ๋“œ๋ฅผ ๊ธฐ๋กํ•˜๋Š” ๋ฐฐ์—ด์ด๊ธฐ ๋•Œ๋ฌธ์— k๊ฐ’์ธ 3์ด ์•„๋‹ˆ๋ผ nxt(1)(3), ์ฆ‰ 3์„ ๊ฑฐ์น˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ์œผ๋กœ ๊ฐ€์•ผ ํ•  ๋…ธ๋“œ๋ฅผ ๊ธฐ๋กํ•ด์•ผ ํ•œ๋‹ค. ๊ทธ๋ ‡๊ธฐ์— nxt(i)(k)๊ฐ’์„ ๊ธฐ๋กํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

์ฒ˜์Œ์—๋Š” ์ค‘๊ฐ„๋…ธ๋“œ(k) 2, ์ถœ๋ฐœ๋…ธ๋“œ(i) 1, ๋„์ฐฉ๋…ธ๋“œ(j) 4์ผ๋•Œ ๊ฐฑ์‹ ๋˜๋Š”๊ฒŒ ์•„๋‹๊นŒ ํ•˜๊ณ  ์ƒ๊ฐํ–ˆ์ง€๋งŒ ๊ฐฑ์‹  ์กฐ๊ฑด์„ ๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

for(int k=1;k<=N;k++){
        for(int i=1;i<=N;i++){
            for(int j=1;j<=N;j++){
                if(arr[i][j]>arr[i][k]+arr[k][j]){
                    arr[i][j]=arr[i][k]+arr[k][j];
                    nxt[i][j]=nxt[i][k]; //์ถ”๊ฐ€๋œ ๋ถ€๋ถ„3
                }
            }
        }
    }

k=2, i=1, j=4์ผ ๋•Œ์—๋Š” arr(1)(4) = INF, arr(i)(k)=1, arr(k)(j)=INF์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ’์ด ๊ฐฑ์‹ ๋˜์ง€ ์•Š๋Š”๋‹ค. (arr(2)(4)๋Š” k๊ฐ€ 3์ผ๋•Œ ๊ฐฑ์‹ ๋˜๋‹ˆ ์•„์ง INF์ผ ์‹œ์ ์ด๋‹ค.)

๊ทธ๋ฆผ์„ ๋ณด๋ฉด ์•Œ๊ฒ ์ง€๋งŒ 1์—์„œ 4๋กœ ๊ฐ€๊ธฐ ์œ„ํ•ด 3์œผ๋กœ ๊ฐ„๋‹ค๊ณ  ๊ฒฝ๋กœ๋ฅผ ๊ธฐ๋กํ•ด๋ฒ„๋ฆฌ๋ฉด 2๋ฅผ ์ƒ๋žตํ•˜๊ฒŒ ๋œ๋‹ค.

๊ด€๋ จ ๋ฌธ์ œ

๊ด€๋ จ ๋ฌธ์ œ๋Š” ๋ฐฑ์ค€์—์„œ ํ’€์–ด๋ณผ ์ˆ˜ ์žˆ๋‹ค.

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

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