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

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค Lv3] : ๋ธ”๋ก ์ด๋™ํ•˜๊ธฐ

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

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

 

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

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

programmers.co.kr

๋กœ๋ด‡์ด ์ง€๋„์˜ ๊ฐ€์žฅ ๋์ ์ธ (N, N)๊นŒ์ง€ ์ด๋™ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์ตœ์†Œ ์‹œ๊ฐ„์„ ๋ฆฌํ„ดํ•ด์ฃผ์ž.

 

ํ’€์ด

 ๋ฌด์ง€์˜ ๋กœ๋ด‡์€ 2์นธ์„ ์ฐจ์ง€ํ•˜๋Š” ๋กœ๋ด‡์ด๋‹ค.

์ƒ,ํ•˜,์ขŒ,์šฐ๋กœ ์ด๋™ํ•˜๊ฑฐ๋‚˜ 90๋„ ํšŒ์ „์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

๋ฌธ์ œ๋ฅผ ์ œ๋Œ€๋กœ ์•ˆ ์ฝ๊ณ  ๋†“์—ฌ์ ธ์žˆ๋Š” ๋ฐฉํ–ฅ์œผ๋กœ๋งŒ ์ด๋™์ด ๊ฐ€๋Šฅํ•œ ์ค„ ์•Œ๊ณ  ๋ฌธ์ œ๋ฅผ ํ’€์–ด์„œ ์‹œ๊ฐ„์„ ๋‚ญ๋น„ํ–ˆ๋‹ค..

 

ํƒ์ƒ‰ ๋ฐฉ๋ฒ•์€ BFS๋ฅผ ์ด์šฉํ•˜๊ณ , ๋ฐฉ๋ฌธ์ฒดํฌ๊ฐ€ ์ค‘์š”ํ•˜๋‹ค.

๋กœ๋ด‡์ด ๋‘ ์นธ์„ ์ฐจ์ง€ํ•˜๊ธฐ ๋•Œ๋ฌธ์— 1์ฐจ์› ๋ฐฐ์—ด๋กœ ๋ฐฉ๋ฌธ์„ ์ฒดํฌํ•˜๊ฒŒ ๋˜๋ฉด, ์„ธ๋กœ๋กœ ์ ‘๊ทผํ–ˆ์„ ๋•Œ์™€ ๊ฐ€๋กœ๋กœ ์ ‘๊ทผํ–ˆ์„ ๋•Œ๋ฅผ ๊ตฌ๋ถ„ํ•˜์ง€ ๋ชปํ•œ๋‹ค.

visited๋ฐฐ์—ด์„ 4์ฐจ์›์œผ๋กœ ๋งŒ๋“ค์–ด์„œ ๋กœ๋ด‡์ด ์ฐจ์ง€ํ•˜๊ณ  ์žˆ๋Š” ๋‘ ์นธ์˜ ์ขŒํ‘œ๋ฅผ pos1, pos2๋ผ๊ณ  ํ–ˆ์„ ๋•Œ,

visited[pos1_y][pos1_x][pos2_y][pos2_x] ์ด๋ ‡๊ฒŒ ํ‘œ์‹œ๋ฅผ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ–ˆ๋‹ค.

 

์ƒ๊ด€์€ ์—†์ง€๋งŒ

์ขŒ์šฐ๋กœ ๋†“์—ฌ์žˆ์„ ๋• ํ•ญ์ƒ ์™ผ์ชฝ์— ์žˆ๋Š” ์นธ์„ pos1,

์ƒํ•˜๋กœ ๋†“์—ฌ์žˆ์„ ๋• ํ•ญ์ƒ ์œ„์ชฝ์— ์žˆ๋Š” ์นธ์„ pos1 ์ด๋ผ๊ณ  ์ •ํ–ˆ๋‹ค.

 

์ด์ œ ๋กœ๋ด‡์˜ ์ด๋™์„ ํ†ต์ œํ•ด์ฃผ์ž.

์œ„์™€ ๊ฐ™์ด ๋กœ๋ด‡์ด ๊ฐ€๋กœ๋กœ ๋†“์—ฌ์ ธ ์žˆ๋‹ค๊ณ  ํ•˜์ž.

๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜์ง€ ์•Š๋Š” ์„ ์—์„œ, ์ƒํ•˜์ขŒ์šฐ๋กœ์˜ ์ด๋™๊ณผ 4๋ฐฉํ–ฅ ํšŒ์ „์„ ๋ชจ๋‘ ๊ณ ๋ คํ•ด์•ผํ•œ๋‹ค.

 

๋จผ์ € ์ƒํ•˜์ขŒ์šฐ๋กœ์˜ ์ด๋™์„ ์‚ดํŽด๋ณด๋ฉด

์ƒ : ์œ„๋กœ ์ด๋™ํ•˜๊ธฐ ์œ„ํ•ด์„  โ‘ ๋ฒˆ ๋‘ ์นธ์— ๋ฒฝ์ด ์—†์–ด์•ผ ํ•œ๋‹ค.

ํ•˜ : ์•„๋ž˜๋กœ ์ด๋™ํ•˜๊ธฐ ์œ„ํ•ด์„  โ‘ก๋ฒˆ ๋‘ ์นธ์— ๋ฒฝ์ด ์—†์–ด์•ผ ํ•œ๋‹ค.

์šฐ : ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์ด๋™ํ•˜๊ธฐ ์œ„ํ•ด์„  โ‘ข๋ฒˆ์— ๋ฒฝ์ด ์—†์–ด์•ผ ํ•œ๋‹ค.

์ขŒ : ์™ผ์ชฝ์œผ๋กœ ์ด๋™ํ•˜๊ธฐ ์œ„ํ•ด์„  โ‘ฃ๋ฒˆ์— ๋ฒฝ์ด ์—†์–ด์•ผ ํ•œ๋‹ค.

 

๋‹ค์Œ์œผ๋กœ ํšŒ์ „์„ ์‚ดํŽด๋ณด๋ฉด

โ‘  : โ‘ ๋ฒˆ ๋ฐฉํ–ฅ์œผ๋กœ ํšŒ์ „ํ•˜๊ธฐ ์œ„ํ•ด์„  โ‘ ๋ฒˆ ๋‘ ์นธ์— ๋ชจ๋‘ ๋ฒฝ์ด ์—†์–ด์•ผ ํ•œ๋‹ค.

โ‘ก : โ‘ก๋ฒˆ ๋ฐฉํ–ฅ์œผ๋กœ ํšŒ์ „ํ•˜๊ธฐ ์œ„ํ•ด์„  โ‘ก๋ฒˆ ๋‘ ์นธ์— ๋ชจ๋‘ ๋ฒฝ์ด ์—†์–ด์•ผ ํ•œ๋‹ค.

 

๋กœ๋ด‡์ด ์„ธ๋กœ๋กœ ๋†“์—ฌ์žˆ์„ ๋•Œ๋„ ๊ฐ™์€ ๋งฅ๋ฝ์œผ๋กœ ์ƒํ™ฉ์„ ๊ณ ๋ คํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

 

์ฝ”๋“œ ์ž‘์„ฑ
 
#include <bits/stdc++.h>
using namespace std;
bool visited[105][105][105][105];
int ans = 987654321;
 
bool is_ok(pair<int,int> pos, int n, vector<vector<int>>& board){
    if(pos.first < 0 || pos.first >= n || pos.second < 0 || pos.second >= n || board[pos.first][pos.second])
        return false;
    return true;
}
 
int solution(vector<vector<int>> board) {
    int answer = 0;
    int n = board.size();
    //Priority_queue pq;
    queue<pair<pair<int,pair<int,int>>pair<int,int>>> q;
    q.push({{0,{0,0}},{0,1}});
    
    while(!q.empty()){
        int T = q.front().first.first;
        pair<int,int> pos1 = q.front().first.second;
        pair<int,int> pos2 = q.front().second;
        q.pop();
        
        if(visited[pos1.first][pos1.second][pos2.first][pos2.second])
            continue;
        visited[pos1.first][pos1.second][pos2.first][pos2.second] = true;
        
        if(pos2.first == n - 1 && pos2.second == n - 1){
            answer = T;
            break;
        }
        
        if(pos1.first == pos2.first){ //ํ˜„์žฌ ๊ฐ€๋กœ๋ฐฉํ–ฅ
            pair<int,int> next = {pos2.first, pos2.second + 1}; //์˜ค๋ฅธ์ชฝ์œผ๋กœ ์ด๋™
            if(is_ok(next, n, board) && !visited[pos2.first][pos2.second][next.first][next.second])
                q.push({{T + 1, pos2},next});
            
            next = {pos1.first, pos1.second - 1}; // ์™ผ์ชฝ์œผ๋กœ
            if(is_ok(next, n, board) && !visited[next.first][next.second][pos1.first][pos1.second])
                q.push({{T + 1, next},pos1});
 
            next = {pos1.first + 1, pos1.second}; // ์™ผ์ชฝ ํšŒ์ „
            
            if(is_ok(next, n, board) && is_ok({pos2.first + 1, pos2.second}, n, board)
              && !visited[next.first][next.second][pos2.first + 1][pos2.second])
                q.push({{T + 1, next}, {pos2.first + 1, pos2.second}});
            
            if(is_ok(next, n, board) && !visited[pos1.first][pos1.second][next.first][next.second]
              && !board[pos2.first + 1][pos2.second])
                q.push({{T + 1, pos1},next});
            
            next = {pos2.first + 1, pos2.second}; // ์˜ค๋ฅธ์ชฝ ํšŒ์ „
            if(is_ok(next, n, board) && !visited[pos2.first][pos2.second][next.first][next.second]
              && !board[pos1.first + 1][pos1.second])
                q.push({{T + 1, pos2},next});
 
            next = {pos1.first - 1, pos1.second};
            if(is_ok(next, n, board) && is_ok({pos2.first - 1, pos2.second}, n, board)
              && !visited[next.first][next.second][pos2.first - 1][pos2.second])
                q.push({{T + 1, next}, {pos2.first - 1, pos2.second}});
            
            if(is_ok(next, n, board) && !visited[next.first][next.second][pos1.first][pos1.second]
              && !board[pos2.first - 1][pos2.second])
                q.push({{T + 1, next},pos1});
            
            next = {pos2.first - 1, pos2.second};
            if(is_ok(next, n, board) && !visited[next.first][next.second][pos2.first][pos2.second]
              && !board[pos1.first - 1][pos1.second])
                q.push({{T + 1, next},pos2});
        }
        else if(pos1.second == pos2.second){ //์„ธ๋กœ ๋ฐฉํ–ฅ
            pair<int,int> next = {pos2.first + 1, pos2.second}; //์•„๋ž˜๋กœ
            if(is_ok(next, n, board) && !visited[pos2.first][pos2.second][next.first][next.second])
                q.push({{T + 1, pos2},next});
            
            next = {pos1.first - 1, pos1.second}; //์œ„๋กœ
            if(is_ok(next, n, board) && !visited[next.first][next.second][pos1.first][pos1.second])
                q.push({{T + 1, next},pos1});
 
            next = {pos1.first, pos1.second + 1};
            if(is_ok(next, n, board) && is_ok({pos2.first, pos2.second + 1}, n, board)
              && !visited[next.first][next.second][pos2.first][pos2.second + 1])
                q.push({{T + 1, next}, {pos2.first, pos2.second + 1}});
            
            if(is_ok(next, n , board) && !visited[pos1.first][pos1.second][next.first][next.second]
               && !board[pos2.first][pos2.second + 1])
                q.push({{T + 1, pos1}, next});
            
            next = {pos2.first, pos2.second + 1};
            if(is_ok(next, n , board) && !visited[pos2.first][pos2.second][next.first][next.second] 
               && !board[pos1.first][pos1.second + 1])
                q.push({{T + 1, pos2}, next});
 
            next = {pos1.first, pos1.second - 1};
            if(is_ok(next,n, board) && is_ok({pos2.first, pos2.second - 1}, n, board)
              && !visited[next.first][next.second][pos2.first][pos2.second - 1])
                q.push({{T + 1, next}, {pos2.first, pos2.second - 1}});
            
            if(is_ok(next, n , board) && !visited[next.first][next.second][pos1.first][pos1.second]
               && !board[pos2.first][pos2.second - 1])
                q.push({{T + 1, next},pos1});
 
            next = {pos2.first, pos2.second - 1};
            if(is_ok(next, n , board) && !visited[next.first][next.second][pos2.first][pos2.second]
               && !board[pos1.first][pos1.second - 1])
                q.push({{T + 1, next},pos2});
        }
    }
    return answer;
}
cs

์ฒ˜์Œ์— ์ด๋™ ๋ฐฉํ–ฅ์„ ์ž˜๋ชป ์•ˆ ์ฑ„ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•œ ํ›„ ๋‚˜์ค‘์— ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด์„œ ์ฝ”๋“œ๊ฐ€ ์—‰๋ง์ด ๋๋‹ค.

728x90