-
백준 1261번 알고스팟(자바) - bfs(우선순위큐)코딩테스트 2023. 1. 25. 15:58
최단 경로가 아니라 벽을 가장 적게 부신 경로를 찾아야 하므로 벽을 부신 횟수에 따라 우선순위큐에 집어 넣어 bfs를 실행한다.
import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.PriorityQueue; import java.util.StringTokenizer; class Room implements Comparable<Room>{ int x; int y; int breakCnt; Room (int x, int y, int breakCnt) { this.x = x; this.y = y; this.breakCnt = breakCnt; } public int compareTo(Room room) { if (this.breakCnt < room.breakCnt) return -1; return 1; } } public class Main { static int m,n; static int[][] room; static int[] dx = {-1,1,0,0}; static int[] dy = {0,0,-1,1}; public static void main(String[] args) throws Exception{ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new StringTokenizer(br.readLine()); m = Integer.parseInt(st.nextToken()); n = Integer.parseInt(st.nextToken()); room = new int[n][m]; for (int i = 0; i < n; i++) { String str = br.readLine(); for (int j = 0; j < m; j++) { room[i][j] = str.charAt(j) - '0'; } } bfs(); } static void bfs() { PriorityQueue<Room> pq = new PriorityQueue<>(); pq.offer(new Room(0,0,0)); boolean[][] visited = new boolean[n][m]; visited[0][0] = true; while (!pq.isEmpty()) { Room now = pq.poll(); if (now.x == n-1 && now.y == m-1) { System.out.println(now.breakCnt); return; } for (int i = 0; i < 4; i++) { int nx = now.x + dx[i]; int ny = now.y + dy[i]; if (nx < 0 || ny < 0 || nx >= n || ny >= m) continue; if (!visited[nx][ny] && room[nx][ny] == 1) { pq.offer(new Room(nx,ny,now.breakCnt+1)); visited[nx][ny] = true; } else if (!visited[nx][ny] && room[nx][ny] == 0) { pq.offer(new Room(nx,ny,now.breakCnt)); visited[nx][ny] = true; } } } } }
'코딩테스트' 카테고리의 다른 글
프로그래머스 leve2.JadenCase (자바) - 문자열(StringTokenizer와 split의 차이) (0) 2023.02.04 백준 13424번 비밀 모임(자바) - 플로이드 워셜 (0) 2023.01.25 백준 18223번 민준이와 마산 그리고 건우(자바) - 다익스트라 (1) 2023.01.25 백준 2164번 카드2(자바) - 큐, 재귀 (0) 2023.01.19 백준 20437번 문자열 게임2(자바) - 투포인터# (0) 2023.01.19