๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿ“ ์•Œ๊ณ ๋ฆฌ์ฆ˜/Code Tree

[์ฝ”๋“œํŠธ๋ฆฌ] ์ฝ”๋“œํŠธ๋ฆฌ๋นต - ์‹œ๋ฎฌ๋ ˆ์ด์…˜ (๊ธฐ์ถœ๋ฌธ์ œ)

์‚ผ์„ฑ SW ์—ญ๋Ÿ‰ํ…Œ์ŠคํŠธ 2022 ํ•˜๋ฐ˜๊ธฐ ๊ธฐ์ถœ

์ฝ”๋“œํŠธ๋ฆฌ๋นต

์ตœ๊ทผ ์ฝ”๋“œํŠธ๋ฆฌ ๋นต์ด ์ „๊ตญ์ ์œผ๋กœ ์ธ๊ธฐ๋ฅผ ์–ป์–ด ํŽธ์˜์ ์—์„œ ํ•ด๋‹น ๋นต์„ ๊ตฌํ•˜๊ธฐ ํž˜๋“ค์–ด์กŒ์Šต๋‹ˆ๋‹ค. ๋นต์„ ๊ตฌํ•˜๊ณ ์ž ํ•˜๋Š” m๋ช…์˜ ์‚ฌ๋žŒ์ด ์žˆ๋Š”๋ฐ, 1๋ฒˆ ์‚ฌ๋žŒ์€ ์ •ํ™•ํžˆ 1๋ถ„์—, 2๋ฒˆ ์‚ฌ๋žŒ์€ ์ •ํ™•ํžˆ 2๋ถ„์—, ..., m๋ฒˆ ์‚ฌ๋žŒ์€ ์ •ํ™•ํžˆ m ๋ถ„์— ๊ฐ์ž์˜ ๋ฒ ์ด์Šค์บ ํ”„์—์„œ ์ถœ๋ฐœํ•˜์—ฌ ํŽธ์˜์ ์œผ๋กœ ์ด๋™ํ•˜๊ธฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ๋žŒ๋“ค์€ ์ถœ๋ฐœ ์‹œ๊ฐ„์ด ๋˜๊ธฐ ์ „๊นŒ์ง€ ๊ฒฉ์ž ๋ฐ–์— ๋‚˜์™€์žˆ์œผ๋ฉฐ, ์‚ฌ๋žŒ๋“ค์ด ๋ชฉํ‘œ๋กœ ํ•˜๋Š” ํŽธ์˜์ ์€ ๋ชจ๋‘ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ์ด ๋ชจ๋“  ์ผ์€ n*n ํฌ๊ธฐ์˜ ๊ฒฉ์ž ์œ„์—์„œ ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค.

์ฝ”๋“œํŠธ๋ฆฌ ๋นต์„ ๊ตฌํ•˜๊ณ  ์‹ถ์€ ์‚ฌ๋žŒ๋“ค์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐฉ๋ฒ•์œผ๋กœ ์›€์ง์ž…๋‹ˆ๋‹ค. ์ด 3๊ฐ€์ง€ ํ–‰๋™์€ ์ด 1๋ถ„ ๋™์•ˆ ์ง„ํ–‰๋˜๋ฉฐ, ์ •ํ™•ํžˆ 1, 2, 3 ์ˆœ์„œ๋กœ ์ง„ํ–‰๋˜์–ด์•ผ ํ•จ์— ์œ ์˜ํ•ฉ๋‹ˆ๋‹ค.

  1. ๊ฒฉ์ž์— ์žˆ๋Š” ์‚ฌ๋žŒ๋“ค ๋ชจ๋‘๊ฐ€ ๋ณธ์ธ์ด ๊ฐ€๊ณ  ์‹ถ์€ ํŽธ์˜์  ๋ฐฉํ–ฅ์„ ํ–ฅํ•ด์„œ 1 ์นธ ์›€์ง์ž…๋‹ˆ๋‹ค. ์ตœ๋‹จ๊ฑฐ๋ฆฌ๋กœ ์›€์ง์ด๋ฉฐ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋กœ ์›€์ง์ด๋Š” ๋ฐฉ๋ฒ•์ด ์—ฌ๋Ÿฌ๊ฐ€์ง€๋ผ๋ฉด ↑, ←, →, ↓ ์˜ ์šฐ์„  ์ˆœ์œ„๋กœ ์›€์ง์ด๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์ตœ๋‹จ๊ฑฐ๋ฆฌ๋ผ ํ•จ์€ ์ƒํ•˜์ขŒ์šฐ ์ธ์ ‘ํ•œ ์นธ ์ค‘ ์ด๋™๊ฐ€๋Šฅํ•œ ์นธ์œผ๋กœ๋งŒ ์ด๋™ํ•˜์—ฌ ๋„๋‹ฌํ•˜๊ธฐ๊นŒ์ง€ ๊ฑฐ์ณ์•ผ ํ•˜๋Š” ์นธ์˜ ์ˆ˜๊ฐ€ ์ตœ์†Œ๊ฐ€ ๋˜๋Š” ๊ฑฐ๋ฆฌ๋ฅผ ๋œปํ•ฉ๋‹ˆ๋‹ค.
  2. ๋งŒ์•ฝ ํŽธ์˜์ ์— ๋„์ฐฉํ•œ๋‹ค๋ฉด ํ•ด๋‹น ํŽธ์˜์ ์—์„œ ๋ฉˆ์ถ”๊ฒŒ ๋˜๊ณ , ์ด๋•Œ๋ถ€ํ„ฐ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์€ ํ•ด๋‹น ํŽธ์˜์ ์ด ์žˆ๋Š” ์นธ์„ ์ง€๋‚˜๊ฐˆ ์ˆ˜ ์—†๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๊ฒฉ์ž์— ์žˆ๋Š” ์‚ฌ๋žŒ๋“ค์ด ๋ชจ๋‘ ์ด๋™ํ•œ ๋’ค์— ํ•ด๋‹น ์นธ์„ ์ง€๋‚˜๊ฐˆ ์ˆ˜ ์—†์–ด์ง์— ์œ ์˜ํ•ฉ๋‹ˆ๋‹ค.
  3. ํ˜„์žฌ ์‹œ๊ฐ„์ด t๋ถ„์ด๊ณ  t ≤ m๋ฅผ ๋งŒ์กฑํ•œ๋‹ค๋ฉด, t๋ฒˆ ์‚ฌ๋žŒ์€ ์ž์‹ ์ด ๊ฐ€๊ณ  ์‹ถ์€ ํŽธ์˜์ ๊ณผ ๊ฐ€์žฅ ๊ฐ€๊นŒ์ด ์žˆ๋Š” ๋ฒ ์ด์Šค ์บ ํ”„์— ๋“ค์–ด๊ฐ‘๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ๊ฐ€์žฅ ๊ฐ€๊นŒ์ด์— ์žˆ๋‹ค๋Š” ๋œป ์—ญ์‹œ 1์—์„œ์™€ ๊ฐ™์ด ์ตœ๋‹จ๊ฑฐ๋ฆฌ์— ํ•ด๋‹นํ•˜๋Š” ๊ณณ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๋ฒ ์ด์Šค์บ ํ”„๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐ€์ง€์ธ ๊ฒฝ์šฐ์—๋Š” ๊ทธ ์ค‘ ํ–‰์ด ์ž‘์€ ๋ฒ ์ด์Šค์บ ํ”„, ํ–‰์ด ๊ฐ™๋‹ค๋ฉด ์—ด์ด ์ž‘์€ ๋ฒ ์ด์Šค ์บ ํ”„๋กœ ๋“ค์–ด๊ฐ‘๋‹ˆ๋‹ค. t๋ฒˆ ์‚ฌ๋žŒ์ด ๋ฒ ์ด์Šค ์บ ํ”„๋กœ ์ด๋™ํ•˜๋Š” ๋ฐ์—๋Š” ์‹œ๊ฐ„์ด ์ „ํ˜€ ์†Œ์š”๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  4. ์ด๋•Œ๋ถ€ํ„ฐ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์€ ํ•ด๋‹น ๋ฒ ์ด์Šค ์บ ํ”„๊ฐ€ ์žˆ๋Š” ์นธ์„ ์ง€๋‚˜๊ฐˆ ์ˆ˜ ์—†๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. 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;
}