๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค/3๋‹จ๊ณ„

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค Lv3] : ๊ฒฝ์ฃผ๋กœ ๊ฑด์„ค

by Jaeguk 2022. 7. 14.
๋ฌธ์ œ ๋งํฌ

https://school.programmers.co.kr/learn/courses/30/lessons/67259

 

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

์ฝ”๋“œ ์ค‘์‹ฌ์˜ ๊ฐœ๋ฐœ์ž ์ฑ„์šฉ. ์Šคํƒ ๊ธฐ๋ฐ˜์˜ ํฌ์ง€์…˜ ๋งค์นญ. ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค์˜ ๊ฐœ๋ฐœ์ž ๋งž์ถคํ˜• ํ”„๋กœํ•„์„ ๋“ฑ๋กํ•˜๊ณ , ๋‚˜์™€ ๊ธฐ์ˆ  ๊ถํ•ฉ์ด ์ž˜ ๋งž๋Š” ๊ธฐ์—…๋“ค์„ ๋งค์นญ ๋ฐ›์œผ์„ธ์š”.

programmers.co.kr

์ฃ ๋ฅด๋””๊ฐ€ ๊ฒฝ์ฃผ๋กœ๋ฅผ ๊ฑด์„คํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์ตœ์†Œ ๋น„์šฉ์„ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ์ž.

 

ํ’€์ด

์ธ์ ‘ํ•œ ์ƒํ•˜์ขŒ์šฐ๋กœ ์›€์งˆ์ผ ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ง์„  ๋„๋กœ๋ฅผ ๊ฑด์„คํ•˜๋Š” ๋ฐ๋Š” 100์›, ์ฝ”๋„ˆ๋ฅผ ๊ฑด์„คํ•˜๋Š” ๋ฐ๋Š” 500์›์ด ์†Œ์š”๋œ๋‹ค.

์ฆ‰, ๊ฐ™์€ ๋ฐฉํ–ฅ์œผ๋กœ ์ด๋™ํ•  ๋•Œ๋Š” ๋„๋กœ๋งŒ ๊ฑด์„คํ•˜๋ฉด ๋˜๋‹ˆ๊นŒ 100์›

๋‹ค๋ฅธ ๋ฐฉํ–ฅ์œผ๋กœ ์ด๋™ํ•  ๋•Œ๋Š” ๋„๋กœ + ์ฝ”๋„ˆ๋ฅผ ๊ฑด์„คํ•ด์•ผํ•˜๋ฏ€๋กœ 600์›์˜ ๋น„์šฉ์ด ๋ฐœ์ƒํ•œ๋‹ค.

 

"๋ฐฉํ–ฅ"์ด ์ค‘์š”ํ•œ ์š”์†Œ์ž„์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

 

์ตœ์†Œ ๋น„์šฉ์„ ์ถœ๋ ฅํ•ด์•ผ ํ•˜๋ฏ€๋กœ "์ตœ๋‹จ๊ฑฐ๋ฆฌ" ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

๊ทธ ์ค‘์—์„œ ๋‚˜๋Š” ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ–ˆ๋‹ค.

 

๊ธฐ์กด์˜ ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๊ฐ ์นธ๋งˆ๋‹ค ์ตœ๋‹จ๊ฑฐ๋ฆฌ๋ฅผ ์ €์žฅํ–ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์ด ๋ฌธ์ œ์—์„œ๋Š” ์ž„์˜์˜ ์นธ์— ๋„์ฐฉํ–ˆ์„ ๋•Œ, ์ฐจ๊ฐ€ ์–ด๋–ค ๋ฐฉํ–ฅ์„ ๋ฐ”๋ผ๋ณด๊ณ  ์žˆ๋Š” ์ง€๋„ ์ค‘์š”ํ•˜๋‹ค.

๊ทธ๋ž˜์„œ ์ขŒํ‘œ + ์ฐจ๊ฐ€ ๋ฐ”๋ผ๋ณด๊ณ  ์žˆ๋Š” ๋ฐฉํ–ฅ๋งˆ๋‹ค ์ตœ๋‹จ๊ฑฐ๋ฆฌ๋ฅผ ๋”ฐ๋กœ ๊ณ„์‚ฐํ–ˆ๋‹ค.

 

์šฐ์„ ์ˆœ์œ„ ํ์— {๋น„์šฉ, ๋ฐฉํ–ฅ}, {๋ฐฉ๋ฌธํ•  ์นธ์˜ ์ขŒํ‘œ} ๋ฅผ ์ €์žฅํ–ˆ๋‹ค.

๊ฑฐ๋ฆฌ๋ฅผ ์ €์žฅํ•˜๋Š” Dist ๋ฐฐ์—ด์„ Dist[4][25][25] ์นธ์œผ๋กœ ๋งŒ๋“ค์–ด ์ฒซ๋ฒˆ์งธ ์ธ๋ฑ์Šค๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ์„ค์ •ํ–ˆ๋‹ค.

๋‚˜๋Š” 0 = ์ƒ, 1 = ํ•˜, 2 = ์ขŒ, 3 = ์šฐ. ์ด๋ ‡๊ฒŒ ์ƒ๊ฐํ–ˆ๋‹ค.

 

์ตœ์ข…์ ์œผ๋กœ Dist[0 ~ 3][n-1][n-2] ๋„ค ๊ฐœ์˜ ๊ฐ’ ์ค‘ ์ตœ์†Œ๊ฐ’์ด ์ •๋‹ต์ด ๋œ๋‹ค.

 

์ฝ”๋“œ ์ž‘์„ฑ
 
#include <bits/stdc++.h>
using namespace std;
const int MAX_N = 25 + 5;
const int INF = INT_MAX;
 
int dx[] = {0,0,-1,1};
int dy[] = {-1,1,0,0};
int Dist[4][MAX_N][MAX_N];
//bool visited[MAX_N][MAX_N];
 
bool is_ok(pair<int,int> pos, vector<vector<int>> board){
    int n = board.size();
    if(pos.first < 0 || pos.first >= n || pos.second < 0 || pos.second >= n
      || board[pos.first][pos.second])
        return false;
    return true;
}
 
void BFS(vector<vector<int>> board){
    priority_queue<pair<pair<int,int>pair<int,int>>> pq;
    
    int board_size = board.size();
    
    pq.push({{0,1},{0,0}});
    pq.push({{0,3},{0,0}});
    
    while(!pq.empty()){
        pair<int,int> now = pq.top().second;
        int cost = -pq.top().first.first;
        int direction = pq.top().first.second;
        pq.pop();
        
        if(Dist[direction][now.first][now.second] != INF)
            continue;
        
        Dist[direction][now.first][now.second] = cost;
        
        if(now.first == board_size - 1 && now.second == board.size() -1)
            continue;
        
        for(int i = 0; i<4; i++){
            pair<int,int> next = {now.first + dy[i], now.second + dx[i]};
            int acost;
            if(direction == i)
                acost = cost + 100;
            else if(direction != i)
                acost = cost + 600;
            if(is_ok(next, board) && Dist[i][next.first][next.second] == INF)
                pq.push({{-acost, i}, next});
        }
    }
}
 
int solution(vector<vector<int>> board) {
    int answer = INF;
    int n = board.size();
    for(int i = 0; i<=board.size(); i++)
        for(int j = 0; j<=board.size(); j++)
            for(int d = 0; d<4; d++)
                Dist[d][i][j] = INF;
    
    BFS(board);
    
    for(int i = 0; i<4; i++)
        answer = min(answer, Dist[i][n-1][n-1]);
    
    return answer;
}
cs
728x90