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

 

ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€

μ½”λ“œ μ€‘μ‹¬μ˜ 개발자 μ±„μš©. μŠ€νƒ 기반의 ν¬μ§€μ…˜ λ§€μΉ­. ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€μ˜ 개발자 λ§žμΆ€ν˜• ν”„λ‘œν•„μ„ λ“±λ‘ν•˜κ³ , λ‚˜μ™€ 기술 ꢁ합이 잘 λ§žλŠ” 기업듀을 λ§€μΉ­ λ°›μœΌμ„Έμš”.

programmers.co.kr

 

 

 

 

 

문제

  • 격자λͺ¨μ–‘ κ²Œμž„νŒ μœ„μ—μ„œ 말을 μ›€μ§μ΄λŠ”λ°, μ‹œμž‘ μœ„μΉ˜μ—μ„œ λͺ©ν‘œ μœ„μΉ˜κΉŒμ§€ μ΅œμ†Œ λͺ‡ λ²ˆλ§Œμ— 도달할 수 μžˆλŠ”μ§€
  • 상, ν•˜, 쒌, 우 4λ°©ν–₯ 쀑 ν•˜λ‚˜λ₯Ό μ„ νƒν•΄μ„œ κ²Œμž„νŒ μœ„μ˜ μž₯μ• λ¬Όμ΄λ‚˜ 맨 끝에 λΆ€λ”ͺ힐 λ•ŒκΉŒμ§€ λ―Έλ„λŸ¬μ Έ μ΄λ™ν•˜λŠ” 것을 ν•œ 번의 μ΄λ™μœΌλ‘œ μΉ©λ‹ˆλ‹€
    • 쀑간에 Gκ°€ λ‚˜μ™€λ„ μž₯애물이 μ•„λ‹ˆλ―€λ‘œ κ·Έλƒ₯ μ§€λ‚˜μΉ˜κ²Œ 됨 (λ¬Έμ œμ—λŠ” 이 말이 μ—†μ–΄μ„œ μ²˜μŒμ— 이거 이해 λͺ»ν–ˆμŒ)
  • "."은 빈 곡간을, "R"은 λ‘œλ΄‡μ˜ 처음 μœ„μΉ˜λ₯Ό, "D"λŠ” μž₯μ• λ¬Όμ˜ μœ„μΉ˜λ₯Ό, "G"λŠ” λͺ©ν‘œμ§€μ 

 

  • λ³΄λ“œκ²Œμž„νŒ μ˜ˆμ‹œ
...D..R
.D.G...
....D.D
D....D.
..D....

"R" μœ„μΉ˜μ—μ„œ μ•„λž˜, μ™Όμͺ½, μœ„, μ™Όμͺ½, μ•„λž˜, 였λ₯Έμͺ½, μœ„ μˆœμ„œλ‘œ 움직이면 7번 λ§Œμ— "G" μœ„μΉ˜μ— 멈좰 μ„€ 수 μžˆλ‹€

 

 

 

 

 

풀이

  • 문제 μ΄ν•΄ν•˜κΈ°

μ²˜μŒμ— 문제λ₯Ό 읽고 μ˜ˆμ‹œλ₯Ό 보며 λͺ‡ 번 움직여야 ν•˜λŠ”μ§€ μ•Œμ•„λ΄€λ‹€. ν•˜μ§€λ§Œ μ™œ 7λ²ˆμ„ 움직여야 ν•˜λŠ”μ§€ μ΄ν•΄ν•˜μ§€ λͺ»ν–ˆλ‹€.

'R μœ„μΉ˜μ—μ„œ μ•„λž˜, μ™Όμͺ½' μ΄λ ‡κ²Œ 움직이면 2λ²ˆλ§Œμ— Gλ₯Ό 움직일 수 μžˆλŠ” 것이 μ•„λ‹Œκ°€? λ„μ €νžˆ 이해가 μ•ˆκ°€μ„œ μ§ˆλ¬Έν•˜κΈ° κ²Œμ‹œνŒμ„ λ΄€λ‹€. μ—­μ‹œ λ‚˜μ²˜λŸΌ 이해λ₯Ό ν•˜μ§€ λͺ»ν•œ μ‚¬λžŒμ˜ κ²Œμ‹œκΈ€μ΄ μžˆμ—ˆλ‹€.. https://school.programmers.co.kr/questions/45898

 

κ²Œμ‹œνŒμ— 달린 λŒ“κΈ€μ„ 보고 이해할 수 μžˆμ—ˆλ‹€. 2λ²ˆμ§Έμ— μ™Όμͺ½μœΌλ‘œ 움직일 λ•Œ μž₯애물이 μ—†μ–΄μ„œ Gλ₯Ό κ·Έλƒ₯ μ§€λ‚˜μΉœλ‹€λŠ” κ²ƒμ΄μ—ˆλ‹€! 포켓λͺ¬μŠ€ν„° κ³¨λ“œλ²„μ „μ˜ μ–ΌμŒλ§΅ κ²Œμž„μ΄λž‘ λΉ„μŠ·ν•˜λ‹€κ³  ν•œλ‹€. https://www.youtube.com/watch?v=QqSREKrNSIg 

 

 

  • κ²©μžνŒμ—μ„œ μƒν•˜μ’Œμš°λ‘œ 이동을 ν•΄ μ΅œμ†Œ 이동 횟수λ₯Ό κ΅¬ν•˜λŠ” 문제둜 κ·Έλž˜ν”„ 탐색 λ¬Έμ œμ΄λ‹€.
  • BFS μ‚¬μš©
    • 말의 μœ„μΉ˜(ν–‰, μ—΄ μ’Œν‘œ)와 이동 횟수λ₯Ό μ €μž₯ν•˜λŠ” Dot 클래슀
    • μƒν•˜μ’Œμš° 탐색을 ν•˜λ©° Queue에 Dot 정보λ₯Ό λ‹΄κ³  λ°©λ¬Έ 체크
    • λͺ©ν‘œ 지점(G)에 λ„λ‹¬ν•˜λ©΄ 이동 횟수 λ°˜ν™˜
    • 큐가 μ’…λ£Œλ˜μ—ˆμ„ λ•Œ(λͺ©ν‘œ 지점에 도달할 수 μ—†μŒ), -1 리턴

 

μœ„μ—κΉŒμ§€λ§Œ κ΅¬ν˜„ν•˜λ©΄ μ „ν˜•μ μΈ μ΅œμ†Œ 이동 횟수λ₯Ό κ΅¬ν•˜λŠ” κ·Έλž˜ν”„ 탐색 λ¬Έμ œμ™€ λΉ„μŠ·ν•˜λ‹€. ν•˜μ§€λ§Œ 이동 λΆ€λΆ„μ—μ„œ 달라진닀.

 

  • μž₯μ• λ¬Ό λ§Œλ‚˜κ±°λ‚˜ 맨 끝에 λΆ€λ”ͺ힐 λ•ŒκΉŒμ§€ λ―Έλ„λŸ¬μ Έ μ΄λ™ν•˜κΈ° κ΅¬ν˜„
    • while 문으둜 μ’Œν‘œ λ²”μœ„ μ•ˆμ— 있고, μž₯애물을 λ§Œλ‚˜μ§€ μ•Šμ„ λ•Œ κΉŒμ§€ λ°©ν–₯ κ·ΈλŒ€λ‘œ 이동해주기
    • 그리고 λ‹€μ‹œ κ·Έ λ°©ν–₯으둜 λ§ˆμ΄λ„ˆμŠ€λ₯Ό ν•΄μ£ΌκΈ°

 

 

 

 

 

μ½”λ“œ

import java.util.*;

class Solution {
    static char[][] graph; //λ³΄λ“œ κ·Έλž˜ν”„
    static int N, M; //ν–‰, μ—΄ 크기
    static boolean[][] visited; //λ°©λ¬Έ μ—¬λΆ€ 채크
    static int[] dx = {-1, 1, 0, 0}; //μƒν•˜μ’Œμš°
    static int[] dy = {0, 0, -1, 1};
    
    static class Dot {
        int x, y, dist; //ν–‰, μ—΄, 이동 횟수
        
        public Dot(int x, int y, int dist) {
            this.x = x;
            this.y = y;
            this.dist = dist;
        }
    }
    
    public int solution(String[] board) {
        N = board.length; 
        M = board[0].length();
        graph = new char[N][M];
        
        int startX = 0, startY = 0;
        
        for(int i = 0; i < N; i++) {
            String str = board[i];
            
            for(int j = 0; j < M; j++) {
                graph[i][j] = str.charAt(j);
                if(graph[i][j] == 'R') {
                    startX = i;
                    startY = j;
                }
            }
        }
        
        visited = new boolean[N][M];
        
        return bfs(startX, startY);
    }
    
    public int bfs(int startX, int startY) {
        Queue<Dot> queue = new LinkedList<>();
        
        queue.add(new Dot(startX, startY, 0));
        visited[startX][startY] = true;
        
        while(!queue.isEmpty()) {
            Dot dot = queue.poll();
            
            for(int d = 0; d < 4; d++) {
                int nx = dot.x + dx[d];
                int ny = dot.y + dy[d];
                
                while((0 <= nx && nx < N && 0 <= ny && ny < M) && (graph[nx][ny] != 'D')) { //μž₯μ• λ¬Όμ΄λ‚˜ 맨 끝에 λΆ€λ”ͺ힐 λ•ŒκΉŒμ§€ λ―Έλ„λŸ¬μ Έ 이동
                    nx += dx[d];
                    ny += dy[d];
                }
                
                if(graph[nx - dx[d]][ny - dy[d]] == 'G') { //λͺ©ν‘œ 도달
                    return dot.dist + 1; //μ΅œμ†Œ 이동 횟수 λ°˜ν™˜
                }
                
                //이동함
                if(!visited[nx - dx[d]][ny - dy[d]]) {
                    queue.add(new Dot(nx - dx[d], ny - dy[d], dot.dist + 1));
                    visited[nx - dx[d]][ny - dy[d]] = true;
                }
            }
            
        }
        
        return -1;
    }
}

 

 

 

 

 

κ²°κ³Ό

 

 

 

 

배운점

  • ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€λŠ” IDEμ—μ„œ ν’€ λ•Œλ³΄λ‹€ 디버깅이 μ–΄λ ΅κ³ , IndexOutOfBound λ‚˜λ©΄ μ–΄λ””μ„œ λ‚¬λŠ”μ§€ μ•ˆμ•Œλ €μ€˜μ„œ μ—λŸ¬λ₯Ό μ°ΎκΈ° μ–΄λ €μš΄ λ…Έλ‹΅μ΄λΌμ„œ μ‹€μˆ˜λ₯Ό 쀄여야 κ² λ‹€κ³  μƒκ°ν–ˆλ‹€.
giraffe_