[프로그래머스][Java] Lv.2 게임 맵 최단거리

2023. 6. 9. 16:26·Algorithms(CT)

이 방법으로 가는 것이 최단거리로 총 11칸을 가야 한다.


문제 분석

 

최솟값을 return 하는 것이기 때문에 BFS를 활용해야겠다고 생각하고 구현하였다.


풀이과정

  1. bfs를 구현하여 시작점인 (0,0)을 넘겨준다.
  2. 벽이 없는 자리를 1로 나타내기 때문에,
    방문했다는 것을 나타내기 위해 시작점을 2로 만들고 bfs를 진행한다.
  3. Queue를 사용하여 현재 칸의 상하좌우를 확인하고,
    벽이 없는 자리이고 아직 방문하지 않은 칸이라면 해당 칸의 x,y좌표를 Queue에 넣습니다.
  4. 현재 칸의 상하좌우 조사가 끝나면, Queue에 넣은 순서대로 다음 칸을 차례대로 방문하며
    map의 해당 칸에 (이전 방문했던 순서+1)을 저장한다.
  5. 도착지점인 (n-1,m-1)에 도착하면 bfs 를 종료하고, map[n-1,m-1]-1값을 return 한다.
     ** 처음 시작지점을 2로 시작했기 때문에 마지막에 -1을 해준다.
  6. 만약 Queue가 비워질 때까지 도착지점에 도달하지 못한다면, bfs를 종료하고 -1을 return 한다.

전체 코드

import java.util.*;
class Solution {
    static int[][] map;
    static int[] dx = {0,1,0,-1}; //방향
    static int[] dy = {1,0,-1,0};
    static int n,m;
    public int solution(int[][] maps) {
        
        map = maps;
        //도착지점
        n = map.length;
        m = map[0].length;
        
        int answer = bfs(0,0);
        
        return answer;
    }
    private static int bfs(int x,int y){
        
        Queue<int[]> q = new LinkedList<>();
        q.add(new int[] {x,y});
        map[x][y]++; //지나온 길을 기억하기 위해 첫 시작점을 2로 한다.
        
        while(!q.isEmpty()){
            int[] now = q.poll();
            //System.out.print("("+now[0]+","+now[1]+") ");
            
            if(now[0]==n-1 && now[1]==m-1)
                return map[n-1][m-1]-1; //처음 시작을 2로 해줬기 때문에 -1한 값을 반환함.
            
            for(int i=0;i<4;i++){
                x=now[0]+dx[i];//x좌표
                y=now[1]+dy[i];//y좌표
                
                //상하좌우 방향으로 움직였을 때 n*m배열 안에 있고,
                //다음 조사할 값이 현재 칸의 idx 보다 작거나 같을 때만 조사한다.
                if(x>=0 && x<n && y>=0 && y<m && map[x][y]==1){
                    q.add(new int[]{x,y});
                    map[x][y] = map[now[0]][now[1]]+1;
                }
            }
            //System.out.println(map[now[0]][now[1]]);
        }
        return -1; //도착지점에 도달하지 못한 경우.
    }
}

'Algorithms(CT)' 카테고리의 다른 글

[프로그래머스][Java] Lv.3 단어 변환  (0) 2023.06.11
[프로그래머스][Java] Lv.2 영어 끝말잇기  (0) 2023.06.10
[프로그래머스][Java] Lv.2 짝지어 제거하기  (0) 2023.06.08
[프로그래머스][Java] Lv.2 피보나치 수  (0) 2023.06.07
[프로그래머스][Java] Lv.4 도둑질  (0) 2023.06.07
'Algorithms(CT)' 카테고리의 다른 글
  • [프로그래머스][Java] Lv.3 단어 변환
  • [프로그래머스][Java] Lv.2 영어 끝말잇기
  • [프로그래머스][Java] Lv.2 짝지어 제거하기
  • [프로그래머스][Java] Lv.2 피보나치 수
gwee_99
gwee_99
bE bETTER!
  • gwee_99
    얼렁이와 뚱땅이
    gwee_99
  • 전체
    오늘
    어제
    • ====Category====
      • Algorithms(CT)
        • Programmers
        • Baekjoon
        • Goorm
      • Web
        • Error 해결
      • BackEnd
        • Spring
        • JPA
      • FrontEnd
        • HTML.CSS
        • JavaScript
      • Language
        • Java
      • Cloud
      • CSTS
      • Books
        • IT 5분 잡학사전
      • 일상
  • 블로그 메뉴

    • 홈
    • 방명록
    • 글쓰기
    • 관리
  • 링크

    • 깃허브
  • 공지사항

  • 인기 글

  • 태그

    BFS
    호텔 대실
    LV.2
    BOJ
    DFS
    IT 잡학사전
    백준
    lv2
    그리디
    Til
    java
    존안님
    구름톤 챌린지
    LV.3
    자바
    코딩테스트
    lv.4
    노마드코더
    Lv.1
    프로그래머스
    DP
    IT 5분 잡학사전
    HTML
    Greedy
    스택
    인프런
    제대로 파는 자바스크립트
    따라하며 배우는 html css
    구름
    개발자북클럽
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
gwee_99
[프로그래머스][Java] Lv.2 게임 맵 최단거리
상단으로

티스토리툴바