Algorithm πŸ§‘πŸ»‍πŸ’»/λ°±μ€€(BOJ)

[λ°±μ€€,c++] 4485번 - 녹색 옷 μž…μ€ μ• κ°€ μ €λ‹€μ§€?

dkswnkk 2022. 11. 2. 23:35

문제

 

4485번: 녹색 옷 μž…μ€ μ• κ°€ μ €λ‹€μ§€?

μ €λ‹€μ˜ μ „μ„€ κ²Œμž„μ—μ„œ ν™”νμ˜ λ‹¨μœ„λŠ” 루피(rupee)λ‹€. 그런데 κ°„ν˜Ή '도둑루피'라 λΆˆλ¦¬λŠ” 검정색 루피도 μ‘΄μž¬ν•˜λŠ”λ°, 이걸 νšλ“ν•˜λ©΄ 였히렀 μ†Œμ§€ν•œ 루피가 κ°μ†Œν•˜κ²Œ λœλ‹€! μ €λ‹€μ˜ μ „μ„€ μ‹œλ¦¬μ¦ˆμ˜ μ£Ό

www.acmicpc.net

 

μ½”λ“œ

#include <iostream>
#include <queue>
#include <vector>
#include <algorithm>
#include <memory.h>
#define INF 1e9

using namespace std;

int N;
int map[126][126];
int d[126][126];
int dx[4] = {0,0,-1,1};
int dy[4] = {-1,1,0,0};

void dijkstra(){
    priority_queue<pair<int,pair<int,int>>, vector<pair<int,pair<int,int>>>, greater<pair<int,pair<int,int>>>>pq;
    pq.push({map[0][0], {0,0}});
    d[0][0] = map[0][0];
    
    while(!pq.empty()){
        int dist = pq.top().first;
        int x = pq.top().second.first;
        int y = pq.top().second.second;
        pq.pop();
        
        for(int i=0; i<4; i++){
            int nx = x + dx[i];
            int ny = y + dy[i];
            if(nx>=0 && nx<N && ny>=0 && ny<N){
                int cost = dist + map[nx][ny];
                if(cost < d[nx][ny]){
                    d[nx][ny] = cost;
                    pq.push({cost,{nx, ny}});
                }
            }
        }
    }
}

int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    int T = 0;
    while(cin>>N){
        T++;
        if(N==0) break;
        for(int i=0; i<N; i++){
            for(int k=0; k<N; k++){
                cin>>map[i][k];
            }
        }
        
        for(int i=0; i<126; i++){
            for(int k=0; k<126; k++){
                d[i][k] = INF;
            }
        }
        
        dijkstra();
        
        cout<<"Problem "<<T<<": "<< d[N-1][N-1]<<'\n';
        memset(d, 0, sizeof(d));
        memset(map, 0, sizeof(map));
        
    }
}

 

풀이

κ·Έλž˜ν”„ 탐색 ν˜•μ‹μ˜ λ‹€μ΅μŠ€νŠΈλΌμž…λ‹ˆλ‹€. μœ„μ²˜λŸΌ 기쑴의 λ…Έλ“œ - κ°„μ„  ν˜•μ‹μ˜ λ‹€μ΅μŠ€νŠΈλΌμ™€λŠ” 살짝 λŠλ‚Œμ΄ λ‹€λ₯΄λ‹ˆ 이번 문제 ν˜•μ‹μ˜ 풀이도 μ΅ν˜€λ‘λ©΄ 쒋을 것 κ°™μŠ΅λ‹ˆλ‹€.

 

[C++, ν…œν”Œλ¦Ώ] λ‹€μ΅μŠ€νŠΈλΌ

λ‹€μ΅μŠ€νŠΈλΌ #include #include #include #define INF 1E9 using namespace std; // λ…Έλ“œμ˜ 개수(V), κ°„μ„ μ˜ 개수(E), μ‹œμž‘ λ…Έλ“œ 번호(K) // λ…Έλ“œμ˜ κ°œμˆ˜λŠ” μ΅œλŒ€ 20000개라고 κ°€μ • int V, E, K; // 각 λ…Έλ“œμ— μ—°κ²°λ˜μ–΄ μžˆλŠ” λ…Έ

dkswnkk.tistory.com