λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

πŸ“ μ•Œκ³ λ¦¬μ¦˜/Programmers

[C++/PGS] Lv.2 : κ²Œμž„ 맡 μ΅œλ‹¨κ±°λ¦¬ (BFS)

 

깊이/λ„ˆλΉ„ μš°μ„  탐색(DFS/BFS) : κ²Œμž„ λ§΅ μ΅œλ‹¨κ±°λ¦¬

문제 좜처 - ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ μ½”λ”©ν…ŒμŠ€νŠΈ 고득점 Kit

 

 

문제 μ„€λͺ…

ROR κ²Œμž„μ€ 두 νŒ€μœΌλ‘œ λ‚˜λˆ„μ–΄μ„œ μ§„ν–‰ν•˜λ©°, μƒλŒ€ νŒ€ μ§„μ˜μ„ λ¨Όμ € νŒŒκ΄΄ν•˜λ©΄ μ΄κΈ°λŠ” κ²Œμž„μž…λ‹ˆλ‹€. λ”°λΌμ„œ, 각 νŒ€μ€ μƒλŒ€ νŒ€ μ§„μ˜μ— μ΅œλŒ€ν•œ 빨리 λ„μ°©ν•˜λŠ” 것이 μœ λ¦¬ν•©λ‹ˆλ‹€.

μ§€κΈˆλΆ€ν„° 당신은 ν•œ νŒ€μ˜ νŒ€μ›μ΄ λ˜μ–΄ κ²Œμž„μ„ μ§„ν–‰ν•˜λ €κ³  ν•©λ‹ˆλ‹€. λ‹€μŒμ€ 5 x 5 크기의 맡에, λ‹Ήμ‹ μ˜ 캐릭터가 (ν–‰: 1, μ—΄: 1) μœ„μΉ˜μ— 있고, μƒλŒ€ νŒ€ μ§„μ˜μ€ (ν–‰: 5, μ—΄: 5) μœ„μΉ˜μ— μžˆλŠ” 경우의 μ˜ˆμ‹œμž…λ‹ˆλ‹€.

μœ„ κ·Έλ¦Όμ—μ„œ 검은색 뢀뢄은 벽으둜 λ§‰ν˜€μžˆμ–΄ 갈 수 μ—†λŠ” 길이며, 흰색 뢀뢄은 갈 수 μžˆλŠ” κΈΈμž…λ‹ˆλ‹€. 캐릭터가 움직일 λ•ŒλŠ” 동, μ„œ, 남, 뢁 λ°©ν–₯으둜 ν•œ μΉΈμ”© μ΄λ™ν•˜λ©°, κ²Œμž„ 맡을 λ²—μ–΄λ‚œ 길은 갈 수 μ—†μŠ΅λ‹ˆλ‹€.
μ•„λž˜ μ˜ˆμ‹œλŠ” 캐릭터가 μƒλŒ€ νŒ€ μ§„μ˜μœΌλ‘œ κ°€λŠ” 두 가지 방법을 λ‚˜νƒ€λ‚΄κ³  μžˆμŠ΅λ‹ˆλ‹€.

  • 첫 번째 방법은 11개의 칸을 μ§€λ‚˜μ„œ μƒλŒ€ νŒ€ μ§„μ˜μ— λ„μ°©ν–ˆμŠ΅λ‹ˆλ‹€.
  • 두 번째 방법은 15개의 칸을 μ§€λ‚˜μ„œ μƒλŒ€νŒ€ μ§„μ˜μ— λ„μ°©ν–ˆμŠ΅λ‹ˆλ‹€.

μœ„ μ˜ˆμ‹œμ—μ„œλŠ” 첫 번째 방법보닀 더 λΉ λ₯΄κ²Œ μƒλŒ€νŒ€ μ§„μ˜μ— λ„μ°©ν•˜λŠ” 방법은 μ—†μœΌλ―€λ‘œ, 이 방법이 μƒλŒ€ νŒ€ μ§„μ˜μœΌλ‘œ κ°€λŠ” κ°€μž₯ λΉ λ₯Έ λ°©λ²•μž…λ‹ˆλ‹€.

λ§Œμ•½, μƒλŒ€ νŒ€μ΄ μžμ‹ μ˜ νŒ€ μ§„μ˜ μ£Όμœ„μ— 벽을 μ„Έμ›Œλ‘μ—ˆλ‹€λ©΄ μƒλŒ€ νŒ€ μ§„μ˜μ— λ„μ°©ν•˜μ§€ λͺ»ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, λ‹€μŒκ³Ό 같은 κ²½μš°μ— λ‹Ήμ‹ μ˜ μΊλ¦­ν„°λŠ” μƒλŒ€ νŒ€ μ§„μ˜μ— 도착할 수 μ—†μŠ΅λ‹ˆλ‹€.

κ²Œμž„ 맡의 μƒνƒœ mapsκ°€ λ§€κ°œλ³€μˆ˜λ‘œ μ£Όμ–΄μ§ˆ λ•Œ, 캐릭터가 μƒλŒ€ νŒ€ μ§„μ˜μ— λ„μ°©ν•˜κΈ° μœ„ν•΄μ„œ μ§€λ‚˜κ°€μ•Ό ν•˜λŠ” 칸의 개수의 μ΅œμ†Ÿκ°’을 return ν•˜λ„λ‘ solution ν•¨μˆ˜λ₯Ό μ™„μ„±ν•΄μ£Όμ„Έμš”. 단, μƒλŒ€ νŒ€ μ§„μ˜μ— 도착할 수 없을 λ•ŒλŠ” -1을 return ν•΄μ£Όμ„Έμš”.

 

 
BFSλŠ” 계속 λΉ„μŠ·ν•œ 문제 ν’€μ–΄λ³΄λ©΄μ„œ μ΅μˆ™ν•΄μ Έμ•Ό 될 것 κ°™λ‹€
νŒ¨ν„΄μ΄ λ‹€ λΉ„μŠ·λΉ„μŠ·ν•œλ° 틀리면 λ„ˆλ¬΄ μ•„κΉŒμšΈλ“―!
 
 
λ‚˜μ˜ 풀이 (C++)
#include<vector>
#include<queue>
#include<iostream>
using namespace std;

int visited[102][102]={0,};
int re[102][102]={0,};

int solution(vector<vector<int> > maps){
    int n = maps.size();
    int m=maps[0].size();
    int answer = 0;
    int dx[4] = {0,1,0,-1};
    int dy[4] = {1,0,-1,0};
    queue<pair<int,int> > q;
    q.push({0,0});
    re[0][0]=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<0||ny<0||nx>=n||ny>=m) continue;
            else if(visited[nx][ny]==1) continue;
            else if(maps[nx][ny]==0) continue;
            else{
                q.push({nx,ny});
                visited[nx][ny] = 1;
                re[nx][ny] = re[a.first][a.second]+1;
            }
        }
    }
    if(re[n-1][m-1]==0) re[n-1][m-1]=-1;
    answer = re[n-1][m-1];
    return answer;
}