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

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค - ๋ฏธ๋กœ ํƒˆ์ถœ

giraffe_ 2023. 8. 2. 23:06

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

 

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

์ฝ”๋“œ ์ค‘์‹ฌ์˜ ๊ฐœ๋ฐœ์ž ์ฑ„์šฉ. ์Šคํƒ ๊ธฐ๋ฐ˜์˜ ํฌ์ง€์…˜ ๋งค์นญ. ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค์˜ ๊ฐœ๋ฐœ์ž ๋งž์ถคํ˜• ํ”„๋กœํ•„์„ ๋“ฑ๋กํ•˜๊ณ , ๋‚˜์™€ ๊ธฐ์ˆ  ๊ถํ•ฉ์ด ์ž˜ ๋งž๋Š” ๊ธฐ์—…๋“ค์„ ๋งค์นญ ๋ฐ›์œผ์„ธ์š”.

programmers.co.kr

 

 

 

 

 

๋ฌธ์ œ

  • ๋ฒฝ์œผ๋กœ ๋œ ์นธ์€ ์ง€๋‚˜๊ฐˆ ์ˆ˜ ์—†๊ณ  ํ†ต๋กœ๋กœ ๋œ ์นธ์œผ๋กœ๋งŒ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋ฏธ๋กœ๋ฅผ ๋น ์ ธ๋‚˜๊ฐ€๋Š” ๋ฌธ์ด ์žˆ๋Š”๋ฐ, ์ด ๋ฌธ์€ ๋ ˆ๋ฒ„๋ฅผ ๋‹น๊ฒจ์„œ๋งŒ ์—ด ์ˆ˜ ์žˆ๋‹ค.
  • ์ถœ๋ฐœ ์ง€์ ์—์„œ ๋จผ์ € ๋ ˆ๋ฒ„๊ฐ€ ์žˆ๋Š” ์นธ์œผ๋กœ ์ด๋™ํ•˜์—ฌ ๋ ˆ๋ฒ„๋ฅผ ๋‹น๊ธด ํ›„ ๋ฏธ๋กœ๋ฅผ ๋น ์ ธ๋‚˜๊ฐ€๋Š” ๋ฌธ์ด ์žˆ๋Š” ์นธ์œผ๋กœ ์ด๋™ํ•˜๋ฉด ๋œ๋‹ค.
    • ์•„์ง ๋ ˆ๋ฒ„๋ฅผ ๋‹น๊ธฐ์ง€ ์•Š์•˜๋”๋ผ๋„ ์ถœ๊ตฌ๊ฐ€ ์žˆ๋Š” ์นธ์„ ์ง€๋‚˜๊ฐˆ ์ˆ˜ ์žˆ๋‹ค.
  • ํ•œ ์นธ์„ ์ด๋™ํ•˜๋Š”๋ฐ 1์ดˆ, ์ตœ๋Œ€ํ•œ ๋น ๋ฅด๊ฒŒ ๋ฏธ๋กœ๋ฅผ ๋น ์ ธ๋‚˜๊ฐ€๋Š”๋ฐ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„ ๊ตฌํ•˜๊ธฐ
    • ํƒˆ์ถœํ•  ์ˆ˜ ์—†๋‹ค๋ฉด -1์„ return
  • S : ์‹œ์ž‘ ์ง€์ , E : ์ถœ๊ตฌ, L : ๋ ˆ๋ฒ„, O : ํ†ต๋กœ, X : ๋ฒฝ
    • ์‹œ์ž‘ ์ง€์ ๊ณผ ์ถœ๊ตฌ, ๋ ˆ๋ฒ„๋Š” ํ•ญ์ƒ ๋‹ค๋ฅธ ๊ณณ์— ์กด์žฌํ•˜๋ฉฐ ํ•œ ๊ฐœ์”ฉ๋งŒ ์กด์žฌ

 

์ž…์ถœ๋ ฅ ์˜ˆ

  • ์ž…๋ ฅ : maps ["SOOOL","XXXXO","OOOOO","OXXXX","OOOOE"]
  • ์ถœ๋ ฅ : 16

์ถœ์ฒ˜ : ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค(https://school.programmers.co.kr/learn/courses/30/lessons/159993)

 

 

 

 

 

ํ’€์ด

  • ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰ ์ค‘ BFS ์‚ฌ์šฉ
    • BFS 1 : S → L๋กœ ๊ฐ€๋Š” ๊ธธ. -1์ด ๋ฆฌํ„ด๋˜์—ˆ์œผ๋ฉด ๋’ค์— ๋Œ๋ฆด ํ•„์š”๋„ ์—†์ด ์ข…๋ฃŒ
    • BFS 2 : L → E ๋กœ ๊ฐ€๋Š” ๊ธธ์— ๋Œ€ํ•ด BFS๋ฅผ ๋Œ๋ฆฐ๋‹ค. -1์ด ๋ฆฌํ„ด๋˜์—ˆ์œผ๋ฉด ์ข…๋ฃŒ, ์•„๋‹ˆ๋ฉด BFS 1 + BFS 2๊ฐ€ ์ •๋‹ต

 

  • ์žฌํ™œ์šฉ์„ฑ์„ ์œ„ํ•ด BFS์— ์‹œ์ž‘ ์‹œ์ ๊ณผ ๋ชฉํ‘œ ์ง€์ ์„ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ค€๋‹ค

 

  • ํ์— ์ง€์ ์˜ ์ขŒํ‘œ์™€ ๊ฑธ๋ฆฐ ์‹œ๊ฐ„์˜ ์ •๋ณด๋ฅผ ๋‹ด์€ ๊ฐ์ฒด๋ฅผ ๋„ฃ๋Š”๋‹ค
    • Point(x, y, dist)

 

 

 

 

 

์ฝ”๋“œ

import java.util.*;

class Solution {
    static int N, M; //ํ–‰, ์—ด ํฌ๊ธฐ
    static char[][] graph; //๊ทธ๋ž˜ํ”„
    static boolean[][] visited; //๋ฐฉ๋ฌธ ์—ฌ๋ถ€ ๋ฐฐ์—ด
    static int[] dx = {-1, 1, 0, 0}; //์ƒํ•˜์ขŒ์šฐ
    static int[] dy = {0, 0, -1, 1};
    
    static class Point {
        int x, y, dist; //ํ–‰, ์—ด, ๊ฑธ๋ฆฐ ์‹œ๊ฐ„
        
        Point(int x, int y, int dist) {
            this.x = x;
            this.y = y;
            this.dist = dist;
        }
    }
    
    public int solution(String[] maps) {
        N = maps.length;
        M = maps[0].length();
        
        graph = new char[N][M];
        
        int SX = 0, SY = 0; //์‹œ์ž‘ ์ขŒํ‘œ
        int LX = 0, LY = 0; //๋ ˆ๋ฒ„ ์ขŒํ‘œ
        
        for(int i = 0; i < N; i++) {
            graph[i] = maps[i].toCharArray();
            
            for(int j = 0; j < M; j++) {
                if(graph[i][j] == 'S') {
                    SX = i;
                    SY = j;
                } else if(graph[i][j] == 'L') {
                    LX = i;
                    LY = j;
                }
            }
        }
        
        int answer = 0;
        
        visited = new boolean[N][M];
        int result1 = bfs(SX, SY, 'L'); //์‹œ์ž‘~๋ ˆ๋ฒ„๊นŒ์ง€ ์‹œ๊ฐ„
        
        if(result1 == -1) {
            return -1;
        } else {
            answer += result1;
        }
        
        visited = new boolean[N][M];
        int result2 = bfs(LX, LY, 'E'); //๋ ˆ๋ฒ„~์ถœ๊ตฌ๊นŒ์ง€ ์‹œ๊ฐ„
        
        if(result2 == -1) {
            return -1;
        } else {
            answer += result2;
        }
        
        return answer;
    }
    
    public int bfs(int i, int j, char goal) {
        Queue<Point> queue = new LinkedList<>();
        
        queue.add(new Point(i, j, 0));
        visited[i][j] = true;
        
        while(!queue.isEmpty()) {
            Point point = queue.poll();
            
            int x = point.x;
            int y = point.y;
            int dist = point.dist;
            
            if(graph[x][y] == goal) {
                return dist;
            }
            
            for(int d = 0; d < 4; d++) {
                int nx = x + dx[d];
                int ny = y + dy[d];
                
                if(0 <= nx && nx < N && 0 <= ny && ny < M) { //๋ฒ”์œ„ ์ฒดํฌ
                    if(!visited[nx][ny] && graph[nx][ny] != 'X') { //๋ฐฉ๋ฌธx, ๋ฒฝ์ด ์•„๋‹˜
                        queue.add(new Point(nx, ny, dist + 1));
                        visited[nx][ny] = true;
                    }
                }
            }
            
        }
        
        return -1;
    }
}

 

 

 

 

๊ฒฐ๊ณผ

 

 

 

 

 

๋ฐฐ์šด์ 