문제

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 |