[백준] 2178번 미로 탐색 - BFS / 너비 탐색 알고리즘 / 클래스

2023. 9. 5. 16:34·Java
문제

 

 

My Code
import java.io.*;
import java.util.LinkedList;
import java.util.Queue;

class ArrGraph{
    private int[][] arrGrapgh; //인접 행렬 선언
    boolean[][] visit; // 방문 배열 선언
    private int n, m; //행과 열 선언
    
    //상하좌우 탐색 배열 선언 및 초기화
    private int[] dx = {0, 1, 0, -1}; 
    private int[] dy = {1, 0, -1, 0};

    //생성자
    public ArrGraph(int n, int m) {
        this.arrGrapgh = new int[n][m];
        this.visit = new boolean[n][m];
        this.n = n;
        this.m = m;
    }
    
    //인접 행렬에 값 저장
    public void put(String str, int i) {
        for (int j = 0; j < str.length(); j++) {
            arrGrapgh[i][j] = Integer.parseInt(str.split("")[j]);
        }
    }
    
    //bfs 실행
    public void bfs(int i, int j){
        Queue<int[]> queue = new LinkedList<>();
        queue.offer(new int[] {i, j});
        while(!queue.isEmpty()){
            int[] now = queue.poll(); 
            visit[i][j] = true;
            for (int k = 0; k<4; k++){ // 상하좌우 탐색
                int x = now[0] + dx[k];
                int y = now[1] + dy[k];
                if(x >= 0 && y >= 0 && x < n && y <m){ //인접 행렬의 범위에 맞게
                    if (arrGrapgh[x][y] != 0 && !visit[x][y]){ 
                        visit[x][y] = true;
                        arrGrapgh[x][y] = arrGrapgh[now[0]][now[1]] + 1; // 1번 움직이면 depth + 1
                        queue.add(new int[] {x, y});
                    }
                }
            }
        }
    }
    
    // 결과 출력
    public void printResult(){
        System.out.println(arrGrapgh[n-1][m-1]);
    }
}

public class Main {
    public static void main(String[] args) throws IOException{
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));

        // 행과 열 입력 받기
        String strNM = bf.readLine();
        int n = Integer.parseInt(strNM.split(" ")[0]);
        int m = Integer.parseInt(strNM.split(" ")[1]);

        // 인접 행렬 선언 및 크기 설정
        ArrGraph arrGraph = new ArrGraph(n, m);

        // 인접 행렬의 한 행씩 저장
        for (int i = 0; i < n; i++){
            String strArr = bf.readLine();
            arrGraph.put(strArr, i);
        }

        arrGraph.bfs(0, 0);
        arrGraph.printResult();
    }
}

 

 

문제의 핵심 & 알게된 점

이 문제는 인접노드를 한번에 탐색하는 BFS를 이용하는게 효율적이다.

이때 인접 노드의 값에 +1을 해준다면

그 깊이에 따라 갖는 값이 같아지기 때문에

결과를 도착 위치(n-1, m-1)의 인접 행렬 값으로 출력하면 된다. 

입력
인접 행렬 결과

이 논리는 위의 결과로 설명이 가능하다.

한 칸씩 이동할 때마다 +1 한다고 생각하면 간단하다.

 

인접 행렬은 2차원 배열이다 보니 Queue에 어떻게 삽입할 지 고민이었는데 

queue.offer(new int[] {i, j});

위와 같은 방식으로 삽입이 가능하단 걸 알게 되었다.

 

상하 좌우로 탐색하는 부분을 switch 또는 if문으로 해야하나 고민이었는데

dx, dy 배열을 선언해서 for반복문을 사용하는 방식을 알게되어 효율적으로 작성할 수 있었다.

 

 

 

참고 강의_인프런의 Do it! 알고리즘 코딩테스트 with JAVA

저작자표시 (새창열림)

'Java' 카테고리의 다른 글

[백준] 11047번 동전 0 - 그리디 알고리즘 / 탐욕 알고리즘  (0) 2023.09.12
[백준] 1920번 수 찾기 - 이진 탐색 알고리즘/ 함수 이용(재귀X)  (0) 2023.09.06
[Java] BFS 구현하기 - 재귀 함수&Queue이용 / 인접 리스트  (1) 2023.09.02
[백준] 11724번 연결 요소의 개수 - DFS방식 / 재귀 함수 이용/ 무방향 그래프  (0) 2023.09.01
[Java] DFS 구현하기 - 재귀 함수 이용 / 인접 리스트 / 배열  (0) 2023.08.31
'Java' 카테고리의 다른 글
  • [백준] 11047번 동전 0 - 그리디 알고리즘 / 탐욕 알고리즘
  • [백준] 1920번 수 찾기 - 이진 탐색 알고리즘/ 함수 이용(재귀X)
  • [Java] BFS 구현하기 - 재귀 함수&Queue이용 / 인접 리스트
  • [백준] 11724번 연결 요소의 개수 - DFS방식 / 재귀 함수 이용/ 무방향 그래프
미우딩
미우딩
다양한 프로그래밍 언어를 공부하고 있는 공대생입니다! Python, Java, C언어를 주로 공부하고 있으며 Figma를 통한 디자인도 종종 올릴 예정입니다.
  • 미우딩
    미우의 코딩 기록
    미우딩
  • 전체
    오늘
    어제
    • 분류 전체보기 (60)
      • Java (47)
      • C언어 (0)
      • 대외활동 (5)
      • Spring (4)
      • 프로젝트 (2)
      • 앱개발 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    IT #코딩테스트 #알고리즘 #투포인터 #시간제한 #Scanner #BufferedReader #StringTokenizer
    IT #알고리즘 #코딩테스트 #퀵정렬 #오름차순정렬
    IT #알고리즘 #그리디알고리즘 #탐욕알고리즘 #코테
    IT #코딩테스트 #이진탐색 #알고리즘
    IT #코딩테스트 #알고리즘 #버블정렬 #오름차순
    IT #코딩테스트 #알고리즘 #DFS #재귀함수 #무방향그래프
    IT #백준 #알고리즘 #코딩테스트 #배열 #형변환 #평균구하기
    IT #백준 #코딩테스트 #알고리즘 #구간합 #반복문
    push #pop #StringBuffer
    IT #BFS #코딩테스트 #구현 #큐 #재귀함수
    IT #알고리즘 #코딩테스트 #우선순위큐 #힙 #절댓값 #오름차순 #정렬
    IT #알고리즘 #코딩테스트 #DFS
    java #android #개발자
    Spring #정적컨텐츠 #MVC #템플릿엔진 #API #애너테이션
    IT #코딩테스트 #알고리즘 #백준 #투포인터 #배열
    android #java #kotlin #상태관리
    IT #알고리즘 #코딩테스트 #삽입정렬 #오름차순정렬
    IT #큐 #알고리즘 #코딩테스트 #자바 #선입선출
    BufferedReader
    IT #코딩테스트 #알고리즘 #슬라이딩윈도우 #투포인터 #함수
    IT #알고리즘 #코딩테스트 #선택정렬 #내림차순정렬 #최댓값
    IT #코딩테스트 #알고리즘 #스택 #
    IT #백준 #알고리즘 #코딩테스트 #배열 #형변환 #아스키코드
    android #java #kotlin #compose
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
미우딩
[백준] 2178번 미로 탐색 - BFS / 너비 탐색 알고리즘 / 클래스
상단으로

티스토리툴바