๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ“ ์•Œ๊ณ ๋ฆฌ์ฆ˜/Programmers

[C++/PGS] [PCCP ๊ธฐ์ถœ๋ฌธ์ œ] 4๋ฒˆ - ์ˆ˜๋ ˆ ์›€์ง์ด๊ธฐ

by xxilliant 2025. 5. 2.
728x90
๋ฐ˜์‘ํ˜•

 

๋ฌธ์ œ

https://school.programmers.co.kr/learn/courses/19344/lessons/242261#

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

 

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

SW๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•œ ํ‰๊ฐ€, ๊ต์œก, ์ฑ„์šฉ๊นŒ์ง€ Total Solution์„ ์ œ๊ณตํ•˜๋Š” ๊ฐœ๋ฐœ์ž ์„ฑ์žฅ์„ ์œ„ํ•œ ๋ฒ ์ด์Šค์บ ํ”„

programmers.co.kr

 


 

ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ฐ•์˜ ไธญ PCCP ๊ธฐ์ถœ๋ฌธ์ œ : 4๋ฒˆ ์ˆ˜๋ ˆ ์›€์ง์ด๊ธฐ (ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ๋ ˆ๋ฒจ 3 / ์ •๋‹ต๋ฅ  18% ๋ฌธ์ œ..)

์†Œ์š”์‹œ๊ฐ„ ์•ฝ 55๋ถ„ (ํžŒํŠธ ์ฐธ๊ณ ํ•จ)

dfs, ๋ฐฑํŠธ๋ž˜ํ‚น ๋ฌธ์ œ, ๋‚œ์ด๋„ level 3-4 ์ถ”์ •

 

๋ฐฑํŠธ๋ž˜ํ‚น ๊ตฌํ˜„.....์ฐธ ํž˜๋“ค๋‹ค....

red, blue ๋‘ ๊ฐœ๋ฅผ ๋™์‹œ์— ์ด๋™์‹œํ‚ค๋‹ˆ๊นŒ ์ฝ”๋“œ ๊ธธ์ด๋„ 2๋ฐฐ ์ด๋ฒคํŠธ~~๐Ÿคฏ๐Ÿคฏ

๋ณธ์ธ์ด ์•„๋‹ˆ๋ผ ๋‹ค๋ฅธ ์ ์ด ๋ฐฉ๋ฌธํ–ˆ๋˜ ๊ณณ์œผ๋กœ๋Š” ์ด๋™์ด ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— visited ๋ฐฐ์—ด๋„ ๋”ฐ๋กœ ํ•„์š”ํ•จ

 

์ฐธ๊ณ ๋กœ, ํ…Œ์ŠคํŠธ์ผ€์ด์Šค 4๋ฒˆ๊ณผ 7๋ฒˆ ๋“ฑ์„ ๊ณ„์† ํ‹€๋ฆฌ๋Š” ๊ฒฝ์šฐ๋Š” ์•„๋ž˜ ์ฃผ์˜์‚ฌํ•ญ ํ™•์ธํ•˜๊ธฐ!!!

 

1. red ๋ง๊ณ  blue๋ฅผ ๋จผ์ € ์›€์ง์ด๋Š” ๊ฒฝ์šฐ๋„ ๊ณ ๋ ค๋˜๋Š”์ง€

2. dfs ๋ถ„๊ธฐ ์ด์ „์— ์กฐ๊ฑด์ฒ˜๋ฆฌ ์ž˜ ํ–ˆ๋Š”์ง€ (๊ฐ™์€ ์นธ์œผ๋กœ ์ด๋™ํ•˜๊ฑฐ๋‚˜, ์„œ๋กœ ์ž๋ฆฌ๋ฅผ ๋ฐ”๊พธ๋Š” ๊ฒฝ์šฐ)

 

 

๋‚˜์˜ ํ’€์ด

#include <string>
#include <vector>
#include <queue>
#include <climits>
using namespace std;

int dx[4] = {0,1,0,-1};
int dy[4] = {1,0,-1,0};
int n; int m;
int answer = INT_MAX;

int rVisited[5][5] = {0,};
int bVisited[5][5] = {0,};
pair<int,int> redStart;
pair<int,int> redEnd;
pair<int,int> blueStart;
pair<int,int> blueEnd;

bool canGo(int x, int y, bool isRed){
    if(x<0 || y<0 || x>=n || y>=m) return false;
    if(isRed){
        if(rVisited[x][y]>0) return false;
    }
    else {
        if(bVisited[x][y]>0) return false;
    }
    return true;
}

void dfs(pair<int,int> r, pair<int,int> b, int count){ // ํ˜„์žฌ ์œ„์น˜, ํšŸ์ˆ˜
    if(r == redEnd && b == blueEnd){
        if(answer>count) answer = count;
        return;
    }
    if(answer < count) return;
    
    vector<pair<int,int>> rv; // ์ด๋™๊ฐ€๋Šฅํ•œ ์นธ์„ ์ €์žฅ
    vector<pair<int,int>> bv;
    // r์ด ์ด๋™๊ฐ€๋Šฅํ•  ๊ฒฝ์šฐ๋ฅผ ์ €์žฅ, end์ง€์ ์ด๋ผ๋ฉด ๊ณ ์ •
    if(r != redEnd){
        for(int i=0; i<4; ++i){
            int rx = r.first + dx[i];
            int ry = r.second + dy[i];
            if(canGo(rx, ry, true)){
                rv.push_back({rx, ry});
            }
        }
    }
    else rv.push_back(redEnd);
    // b๊ฐ€ ์ด๋™๊ฐ€๋Šฅํ•  ๊ฒฝ์šฐ๋ฅผ ์ €์žฅ, end์ง€์ ์ด๋ผ๋ฉด ๊ณ ์ •
    if(b != blueEnd){
        for(int i=0; i<4; ++i){
            int bx = b.first + dx[i];
            int by = b.second + dy[i];
            if(canGo(bx, by, false)){
                bv.push_back({bx, by});
            }
        }
    }
    else bv.push_back(blueEnd);
    // dfs ๋ฐ ๋ฐฑํŠธ๋ž˜ํ‚น ์‹œํ–‰
    for(auto rr: rv){
        for(auto bb: bv){
            if(rr == bb) continue; // ๊ฐ™์€ ์นธ์œผ๋กœ X
            if(rr == b && r == bb) continue; // ์ž๋ฆฌ๋ฐ”๊พธ๊ธฐ X
            rVisited[rr.first][rr.second] = 1;
            bVisited[bb.first][bb.second] = 2;
            dfs(rr, bb, count+1);
            rVisited[rr.first][rr.second] = 0;
            bVisited[bb.first][bb.second] = 0;
        }
    }
}

int solution(vector<vector<int>> maze) {
    n = maze.size();
    m = maze[0].size();
    
    // ๊ฐ ์ขŒํ‘œ์™€ ํ•จ์ • ์œ„์น˜๋ฅผ ์ €์žฅ
    for(int i=0; i<n; ++i){
        for(int j=0; j<m; ++j){
            switch(maze[i][j]){
                case 1:
                    redStart = {i,j};
                    rVisited[i][j] = 1;
                    break;
                case 2: 
                    blueStart = {i,j};
                    bVisited[i][j] = 2;
                    break;
                case 3:
                    redEnd = {i,j}; break;
                case 4:
                    blueEnd = {i,j}; break;
                case 5:
                    rVisited[i][j] = 5;
                    bVisited[i][j] = 5; break;
            }
        }
    }
    
    // dfs ์ง„์ž…
    dfs(redStart, blueStart, 0);
    // ์ตœ์†Ÿ๊ฐ’์ด ๊ฐฑ์‹ ๋˜์ง€ ์•Š์•˜๋‹ค๋ฉด 0์„ ๋ฆฌํ„ด
    if(answer == INT_MAX) answer = 0;
    return answer;
}

728x90
๋ฐ˜์‘ํ˜•