๋ฌธ์
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;
}
'๐ ์๊ณ ๋ฆฌ์ฆ > Programmers' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[C++/PGS] Lv.3 : ์์ ๋ณต์ํ๊ธฐ (PCCP ๊ธฐ์ถ๋ฌธ์ 4๋ฒ) - ๋ณด๋ฅ๐ฅต (0) | 2025.05.02 |
---|---|
[C++/PGS] Lv.1 : ๋์์ ์ฌ์๊ธฐ (PCCP ๊ธฐ์ถ๋ฌธ์ 1๋ฒ) (0) | 2025.05.02 |
[C++/PGS] [PCCP ๊ธฐ์ถ๋ฌธ์ ] 1๋ฒ - ๋ถ๋ ๊ฐ๊ธฐ (0) | 2025.05.02 |
[C++/PGS] [PCCP ๋ชจ์๊ณ ์ฌ #1] 3๋ฒ - ์ ์ ๋ฒ์น ๐คฏ (0) | 2025.05.02 |
[C++/PGS] [PCCP ๋ชจ์๊ณ ์ฌ #1] 2๋ฒ - ์ฒด์ก๋ํ (0) | 2025.05.02 |