์ผ์ฑ SW ์ญ๋ํ ์คํธ 2022 ํ๋ฐ๊ธฐ ๊ธฐ์ถ
์ฝ๋ํธ๋ฆฌ๋นต
์ต๊ทผ ์ฝ๋ํธ๋ฆฌ ๋นต์ด ์ ๊ตญ์ ์ผ๋ก ์ธ๊ธฐ๋ฅผ ์ป์ด ํธ์์ ์์ ํด๋น ๋นต์ ๊ตฌํ๊ธฐ ํ๋ค์ด์ก์ต๋๋ค. ๋นต์ ๊ตฌํ๊ณ ์ ํ๋ m๋ช ์ ์ฌ๋์ด ์๋๋ฐ, 1๋ฒ ์ฌ๋์ ์ ํํ 1๋ถ์, 2๋ฒ ์ฌ๋์ ์ ํํ 2๋ถ์, ..., m๋ฒ ์ฌ๋์ ์ ํํ m ๋ถ์ ๊ฐ์์ ๋ฒ ์ด์ค์บ ํ์์ ์ถ๋ฐํ์ฌ ํธ์์ ์ผ๋ก ์ด๋ํ๊ธฐ ์์ํฉ๋๋ค. ์ฌ๋๋ค์ ์ถ๋ฐ ์๊ฐ์ด ๋๊ธฐ ์ ๊น์ง ๊ฒฉ์ ๋ฐ์ ๋์์์ผ๋ฉฐ, ์ฌ๋๋ค์ด ๋ชฉํ๋ก ํ๋ ํธ์์ ์ ๋ชจ๋ ๋ค๋ฆ ๋๋ค. ์ด ๋ชจ๋ ์ผ์ n*n ํฌ๊ธฐ์ ๊ฒฉ์ ์์์ ์งํ๋ฉ๋๋ค.
์ฝ๋ํธ๋ฆฌ ๋นต์ ๊ตฌํ๊ณ ์ถ์ ์ฌ๋๋ค์ ๋ค์๊ณผ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก ์์ง์ ๋๋ค. ์ด 3๊ฐ์ง ํ๋์ ์ด 1๋ถ ๋์ ์งํ๋๋ฉฐ, ์ ํํ 1, 2, 3 ์์๋ก ์งํ๋์ด์ผ ํจ์ ์ ์ํฉ๋๋ค.
- ๊ฒฉ์์ ์๋ ์ฌ๋๋ค ๋ชจ๋๊ฐ ๋ณธ์ธ์ด ๊ฐ๊ณ ์ถ์ ํธ์์ ๋ฐฉํฅ์ ํฅํด์ 1 ์นธ ์์ง์ ๋๋ค. ์ต๋จ๊ฑฐ๋ฆฌ๋ก ์์ง์ด๋ฉฐ ์ต๋จ ๊ฑฐ๋ฆฌ๋ก ์์ง์ด๋ ๋ฐฉ๋ฒ์ด ์ฌ๋ฌ๊ฐ์ง๋ผ๋ฉด ↑, ←, →, ↓ ์ ์ฐ์ ์์๋ก ์์ง์ด๊ฒ ๋ฉ๋๋ค. ์ฌ๊ธฐ์ ์ต๋จ๊ฑฐ๋ฆฌ๋ผ ํจ์ ์ํ์ข์ฐ ์ธ์ ํ ์นธ ์ค ์ด๋๊ฐ๋ฅํ ์นธ์ผ๋ก๋ง ์ด๋ํ์ฌ ๋๋ฌํ๊ธฐ๊น์ง ๊ฑฐ์ณ์ผ ํ๋ ์นธ์ ์๊ฐ ์ต์๊ฐ ๋๋ ๊ฑฐ๋ฆฌ๋ฅผ ๋ปํฉ๋๋ค.
- ๋ง์ฝ ํธ์์ ์ ๋์ฐฉํ๋ค๋ฉด ํด๋น ํธ์์ ์์ ๋ฉ์ถ๊ฒ ๋๊ณ , ์ด๋๋ถํฐ ๋ค๋ฅธ ์ฌ๋๋ค์ ํด๋น ํธ์์ ์ด ์๋ ์นธ์ ์ง๋๊ฐ ์ ์๊ฒ ๋ฉ๋๋ค. ๊ฒฉ์์ ์๋ ์ฌ๋๋ค์ด ๋ชจ๋ ์ด๋ํ ๋ค์ ํด๋น ์นธ์ ์ง๋๊ฐ ์ ์์ด์ง์ ์ ์ํฉ๋๋ค.
- ํ์ฌ ์๊ฐ์ด t๋ถ์ด๊ณ t ≤ m๋ฅผ ๋ง์กฑํ๋ค๋ฉด, t๋ฒ ์ฌ๋์ ์์ ์ด ๊ฐ๊ณ ์ถ์ ํธ์์ ๊ณผ ๊ฐ์ฅ ๊ฐ๊น์ด ์๋ ๋ฒ ์ด์ค ์บ ํ์ ๋ค์ด๊ฐ๋๋ค. ์ฌ๊ธฐ์ ๊ฐ์ฅ ๊ฐ๊น์ด์ ์๋ค๋ ๋ป ์ญ์ 1์์์ ๊ฐ์ด ์ต๋จ๊ฑฐ๋ฆฌ์ ํด๋นํ๋ ๊ณณ์ ์๋ฏธํฉ๋๋ค. ๊ฐ์ฅ ๊ฐ๊น์ด ๋ฒ ์ด์ค์บ ํ๊ฐ ์ฌ๋ฌ ๊ฐ์ง์ธ ๊ฒฝ์ฐ์๋ ๊ทธ ์ค ํ์ด ์์ ๋ฒ ์ด์ค์บ ํ, ํ์ด ๊ฐ๋ค๋ฉด ์ด์ด ์์ ๋ฒ ์ด์ค ์บ ํ๋ก ๋ค์ด๊ฐ๋๋ค. t๋ฒ ์ฌ๋์ด ๋ฒ ์ด์ค ์บ ํ๋ก ์ด๋ํ๋ ๋ฐ์๋ ์๊ฐ์ด ์ ํ ์์๋์ง ์์ต๋๋ค.
- ์ด๋๋ถํฐ ๋ค๋ฅธ ์ฌ๋๋ค์ ํด๋น ๋ฒ ์ด์ค ์บ ํ๊ฐ ์๋ ์นธ์ ์ง๋๊ฐ ์ ์๊ฒ ๋ฉ๋๋ค. t๋ฒ ์ฌ๋์ด ํธ์์ ์ ํฅํด ์์ง์ด๊ธฐ ์์ํ๋๋ผ๋ ํด๋น ๋ฒ ์ด์ค ์บ ํ๋ ์์ผ๋ก ์ ๋ ์ง๋๊ฐ ์ ์์์ ์ ์ํฉ๋๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก ๊ฒฉ์์ ์๋ ์ฌ๋๋ค์ด ๋ชจ๋ ์ด๋ํ ๋ค์ ํด๋น ์นธ์ ์ง๋๊ฐ ์ ์์ด์ง์ ์ ์ํฉ๋๋ค.
(์ค๋ต)
์ ๋ ฅ ํ์
์ฒซ ๋ฒ์งธ ์ค์๋ ๊ฒฉ์์ ํฌ๊ธฐ n๊ณผ ์ฌ๋์ ์ m์ด ๊ณต๋ฐฑ์ ์ฌ์ด์ ๋๊ณ ์ฃผ์ด์ง๋๋ค.
์ดํ n๊ฐ์ ์ค์ ๊ฑธ์ณ ๊ฒฉ์์ ์ ๋ณด๊ฐ ์ฃผ์ด์ง๋๋ค. ๊ฐ ์ค์ ๊ฐ๊ฐ์ ํ์ ํด๋นํ๋ n๊ฐ์ ์๊ฐ ๊ณต๋ฐฑ์ ์ฌ์ด์ ๋๊ณ ์ฃผ์ด์ง๋๋ค.
0์ ๊ฒฝ์ฐ์๋ ๋น ๊ณต๊ฐ, 1์ ๊ฒฝ์ฐ์๋ ๋ฒ ์ด์ค์บ ํ๋ฅผ ์๋ฏธํฉ๋๋ค.
์ดํ m๊ฐ์ ์ค์ ๊ฑธ์ณ ๊ฐ ์ฌ๋๋ค์ด ๊ฐ๊ณ ์ ํ๋ ํธ์์ ์์น์ ํ x, ์ด y์ ์ ๋ณด๊ฐ ๊ณต๋ฐฑ์ ์ฌ์ด์ ๋๊ณ ์ฃผ์ด์ง๋๋ค.
๊ฐ ์ฌ๋๋ง๋ค ๊ฐ๊ณ ์ถ์ ํธ์์ ์ ์์น๋ ๊ฒน์น์ง ์์ผ๋ฉฐ, ํธ์์ ์ ์์น์ ๋ฒ ์ด์ค์บ ํ์ ์์น๋ ๊ฒน์น์ง ์์ต๋๋ค.
- 2 ≤ n ≤ 15
- 1 ≤ m ≤
- m ≤ ๋ฒ ์ด์ค ์บ ํ์ ๊ฐ์ ≤
์ถ๋ ฅ ํ์
๋ชจ๋ ์ฌ๋์ด ํธ์์ ์ ๋์ฐฉํ๋ ์๊ฐ์ ์ถ๋ ฅํ์ธ์.
๋ฌธ์ ์กฐ๊ฑด์ ์ํด ์ด๋ ํ ์ฌ๋์ด ์ํ๋ ํธ์์ ์ ๋๋ฌํ์ง ๋ชปํ๊ฒ ๋๋ ๊ฒฝ์ฐ๋ ์ ๋ ๋ฐ์ํ์ง ์์์ ๊ฐ์ ํด๋ ์ข์ต๋๋ค.
๋ํ, ์ด๋ํ๋ ๋์ค ๋์ผํ ์นธ์ ๋ ์ด์์ ์ฌ๋์ด ์์นํ๊ฒ ๋๋ ๊ฒฝ์ฐ ์ญ์ ๊ฐ๋ฅํจ์ ์ ์ํฉ๋๋ค.
ํ์๊ฐ๋์ ๊ฒจ์ฐ step3๋ง ๊ตฌํํด๋๊ณ
๋๋ฌด ์ค๋ ๊ฑธ๋ฆฌ๊ธฐ๋ ํ๊ณ
์ฐ์ ์์ ์ขํ ๋๋ฌธ์ bfs๋ฅผ ํธ์์ ๋ถํฐ ํ์ํ๋๊ฒ ๋ง๋ ์ถ์ด์ ํด์ค ํ์ด๋ฅผ ์ฐธ๊ณ ํ๋ค
๊ฒฐ๋ก ์ ๋ด ๋ฐฉ๋ฒ์ด ๋ง์์
๊ทธ๋ฆฌ๊ณ ์ฌ๋(people) ์ขํ์ ํธ์์ (store) ์ขํ๋ฅผ pair๋ก ์ ์ฅํด๋์ผ๋ฉด
๋์ค์ ๊ฐ๊ฐ ์ธ๋ฑ์ค๋ก ๋น๊ตํ๊ธฐ ํธํ๋ค๋ ๊ฑธ ๋ฐ๊ฒฌํด์ ๊ทธ๊ฒ๋ ์จ๋จน์๋ค!
๋ํ ์ฒ์ ์ ์ถ์์ ์๊ฐ์ด๊ณผ๊ฐ ๋ฌ๋๋ฐ
์๊ณ ๋ณด๋ step3 ๊ณผ์ ์์ findCamp ํจ์์ ๋ฌธ์ ๊ฐ ์์๋ค.
์ฌ์ค ์ ํํ ์ด์ ๋ ๋ชจ๋ฅด๊ฒ ์ง๋ง ํ์ด๋ ๋น๊ต๋ฅผ ํด๋ณด๋
if(visited[i][j] && campMap[i][j] == 1) ์ฌ๊ธฐ์ visited ์กฐ๊ฑด์ ์ถ๊ฐํ์ง ์์ผ๋ฉด ์๊ฐ์ด๊ณผ๊ฐ ์ผ์ด๋จ.
+
why?
์ฌ๋์ด ์๋ ์บ ํ(๋ชป ์ง๋๊ฐ๋ ์นธ)๋ฅผ BFS ๊ณผ์ ์ค visited์์ ๊ฑธ๋ ์ผ๋๊น, findCamp์์๋ ์ด๋ฅผ ๊ฑธ๋ฌ์ผ ํจ!!
๊ทธ๋์ visited[i][j] ๋ฅผ ํ์ธํ๊ฑฐ๋, campMap[i][j] != 9 ์กฐ๊ฑด์ ์ถ๊ฐํ์ด์ผ ํ๋ ๊ฒ์ด๋ค
์ธ์์...์ด๋ฐ๊ฑฐ ์กฐ๊ฑด ํ๋ํ๋ ๋ฐ์ง๋ฉด์ ์ ์๊ฐํด์ผ๊ฒ ๋คใ
๋์ ํ์ด
#include <iostream>
#include <queue>
using namespace std;
int n;
int m;
int campMap[16][16];
pair<int,int> store[226];
int finish[226];
int timer = 0;
queue<pair<int,int>> q;
int dx[4] = {-1,0,0,1}; // ์ฐ์ ์์๋๋ก
int dy[4] = {0,-1,1,0};
pair<int,int> people[226];
int visited[16][16]={0};
int step[16][16] = {0};
void findCamp(int person){
// ์บ ํ ์์น & step ์ต์๊ฐ ์ฐพ๊ธฐ
int minCamp = 500;
int x; int y;
for(int i=1; i<=n; ++i){
for(int j=1; j<=n; ++j){
if(visited[i][j] && campMap[i][j] == 1){ // visited ์ถ๊ฐ์ํด์ ์๊ฐ์ด๊ณผ๋จ
if(step[i][j] < minCamp) {
minCamp = step[i][j];
x = i; y = j;
}
}
}
}
campMap[x][y] = 9;
people[person] = {x,y};
// cout << x<<" "<<y<<"\n";
}
void findBFS(pair<int,int> str){
for(int i = 1; i <= n; i++){
for(int j = 1; j <= n; j++) {
visited[i][j] = 0;
step[i][j] = 0;
}
}
int firstcamp = 0;
q.push({str.first, str.second});
visited[str.first][str.second] = 1;
while(!q.empty()){
pair<int,int> a = q.front();
q.pop();
for(int i=0; i<4; ++i){
int nx = a.first + dx[i];
int ny = a.second + dy[i];
if(nx<1 || ny<1 || nx>n || ny>n) continue;
if(campMap[nx][ny] == 9) continue; // ์ฌ๋์ด ๊ฑฐ์ณ๊ฐ ์บ ํ
if(visited[nx][ny]==1) continue;
step[nx][ny] = step[a.first][a.second] + 1;
q.push({nx,ny});
visited[nx][ny] = 1;
}
}
}
void movePeople(){
// step 1
for(int i=1; i<=m; ++i){
if(people[i] == make_pair(-1,-1) || people[i] == store[i]) continue;
findBFS(store[i]);
int px = people[i].first;
int py = people[i].second;
int mx = 0; int my = 0;
int mindist = 500;
for(int j=0; j<4; ++j){ // ์ด๋ํ ์์น ์ฐพ๊ธฐ
int nx = px + dx[j];
int ny = py + dy[j];
if(nx<1 || ny<1 || nx>n || ny>n) continue;
if(campMap[nx][ny] == 9) continue;
if(visited[nx][ny] && mindist > step[nx][ny]){
mindist = step[nx][ny];
mx = nx; my = ny;
}
}
people[i] = {mx, my};
// step 2
if(people[i] == store[i]){
campMap[people[i].first][people[i].second] = 9;
finish[i] = 1;
}
}
// step 3
if(timer > m) return;
findBFS(store[timer]);
findCamp(timer);
}
int main() {
int x; int y;
cin>>n>>m;
for(int i=1; i<=n; ++i){
for(int j=1; j<=n; ++j){
cin>>campMap[i][j];
}
}
for(int i=1; i<=m; ++i){
cin >> x >> y;
store[i] = {x,y};
}
for(int i = 1; i <= m; i++){
people[i] = {-1,-1};
}
while(1){
timer++;
movePeople();
bool stop = true;
for(int i=1; i<=m; ++i){
if(finish[i]==0) {
stop = false;
};
}
if(stop) break;
}
cout << timer;
return 0;
}
'๐ ์๊ณ ๋ฆฌ์ฆ > Code Tree' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์ฝ๋ํธ๋ฆฌ] ์ ์ก๋ฉด์ฒด ํ๋ฒ ๋ ๊ตด๋ฆฌ๊ธฐ - ์๋ฎฌ๋ ์ด์ (๊ธฐ์ถ๋ฌธ์ ) (1) | 2023.04.08 |
---|---|
[์ฝ๋ํธ๋ฆฌ] ์ธ์๋ - ์๋ฎฌ๋ ์ด์ (๊ธฐ์ถ๋ฌธ์ ) (0) | 2023.04.07 |
[์ฝ๋ํธ๋ฆฌ] ๋๋ฌด๋ฐ๋ฉธ - ์๋ฎฌ๋ ์ด์ (๊ธฐ์ถ๋ฌธ์ ) (0) | 2023.04.07 |
[์ฝ๋ํธ๋ฆฌ] ์์ ์ฑ - ์๋ฎฌ๋ ์ด์ , BFS/DFS (๊ธฐ์ถ๋ฌธ์ ) (2) | 2023.04.06 |
[์ฝ๋ํธ๋ฆฌ] BFS ํ์ / ๊ฐ ์ ์๋ ๊ณณ๋ค (0) | 2023.02.22 |