π [λ°±μ€μκ³ λ¦¬μ¦ νμ΄] Q.1261 μκ³ μ€ν λ¬Έμ νμ΄ - java
π λ¬Έμ
https://www.acmicpc.net/problem/1261
μκ³ μ€ν μ΄μμ§μ΄ λͺ¨λ λ―Έλ‘μ κ°νλ€. λ―Έλ‘λ NM ν¬κΈ°μ΄λ©°, μ΄ 11ν¬κΈ°μ λ°©μΌλ‘ μ΄λ£¨μ΄μ Έ μλ€. λ―Έλ‘λ λΉ λ°© λλ λ²½μΌλ‘ μ΄λ£¨μ΄μ Έ μκ³ , λΉ λ°©μ μμ λ‘κ² λ€λ μ μμ§λ§, λ²½μ λΆμμ§ μμΌλ©΄ μ΄λν μ μλ€.
μκ³ μ€ν μ΄μμ§μ μ¬λ¬λͺ μ΄μ§λ§, νμ λͺ¨λ κ°μ λ°©μ μμ΄μΌ νλ€. μ¦, μ¬λ¬ λͺ μ΄ λ€λ₯Έ λ°©μ μμ μλ μλ€. μ΄λ€ λ°©μμ μ΄λν μ μλ λ°©μ μνμ’μ°λ‘ μΈμ ν λΉ λ°©μ΄λ€. μ¦, νμ¬ μ΄μμ§μ΄ (x, y)μ μμ λ, μ΄λν μ μλ λ°©μ (x+1, y), (x, y+1), (x-1, y), (x, y-1) μ΄λ€. λ¨, λ―Έλ‘μ λ°μΌλ‘ μ΄λ ν μλ μλ€.
λ²½μ νμμλ μ΄λν μ μμ§λ§, μκ³ μ€νμ 무기 AOJλ₯Ό μ΄μ©ν΄ λ²½μ λΆμμ΄ λ²λ¦΄ μ μλ€. λ²½μ λΆμλ©΄, λΉ λ°©κ³Ό λμΌν λ°©μΌλ‘ λ³νλ€.
λ§μ½ μ΄ λ¬Έμ κ° μκ³ μ€νμ μλ€λ©΄, μ΄μμ§λ€μ κΆκ·Ήμ 무기 sudoλ₯Ό μ΄μ©ν΄ λ²½μ ν λ²μ λ€ μμ λ²λ¦΄ μ μμ§λ§, μνκΉκ²λ μ΄ λ¬Έμ λ Baekjoon Online Judgeμ μλ‘λμ΄ μκΈ° λλ¬Έμ, sudoλ₯Ό μ¬μ©ν μ μλ€.
νμ¬ (1, 1)μ μλ μκ³ μ€ν μ΄μμ§μ΄ (N, M)μΌλ‘ μ΄λνλ €λ©΄ λ²½μ μ΅μ λͺ κ° λΆμμ΄μΌ νλμ§ κ΅¬νλ νλ‘κ·Έλ¨μ μμ±νμμ€.
π μ κ·Όλ²
BOJ Q.1261 μκ³ μ€ν λ¬Έμ μ λλ€. N*M ν¬κΈ°μ λ―Έλ‘κ° μ£Όμ΄μ§κ³ λ―Έλ‘λ λΉ λ°© λλ λ²½μΌλ‘ μ΄λ£¨μ΄μ Έ μμ΅λλ€.
λΉ λ°©μ κ·Έλ₯ μ§λλ€λ μ μκ³ λ²½μ λΆμκ³ μ΄λμ΄ κ°λ₯ν©λλ€.
μ΄λμ μΈμ ν λμλ¨λΆμΌλ‘λ§ κ°λ₯ν©λλ€.
1,1 μ§μ μμ μΆλ°νλ€κ³ ν λ N,MκΉμ§ μ΄λμ νλ €κ³ νλλ° μ΄λ λ²½μ μ΅μ λͺ κ°λ₯Ό λΆμ΄μΌνλμ§λ₯Ό ꡬνλ λ¬Έμ μ λλ€.
λ¬Έμ λ₯Ό 보면 N*M ν¬κΈ°μ λ―Έλ‘κ° μ£Όμ΄μ§κ³ λμλ¨λΆμΌλ‘ μ΄λμ΄ κ°λ₯νλ
μΌλ°μ μΈ bfs νμμΌλ‘ νμ΄κ° κ°λ₯ν΄λ³΄μ λλ€.
νμ§λ§, μ΄ λ¬Έμ μμ ν΅μ¬μΈ κ°μ€μΉκ° μ΄λ거리λΌλ©΄ μΌλ°μ μΈ bfs νμμΌλ‘ νμ΄κ° κ°λ₯νκ² μ§λ§
μ¬κΈ°μ κ°μ€μΉλ μ΄λκ±°λ¦¬κ° μλ λ²½μ λΆμλ κ°―μμ λλ€.
λ²½μ΄ μλ μλμ λ°λΌ λΆμκ³ μ΄λν μλ μκ³ (1) κ·Έλ₯ μ΄λν μλ μμ΅λλ€. (0)
κ°μ€μΉκ° 1μ΄ μλ 1 λλ 0μΈ κ·Έλνλ₯Ό νμν΄μΌ νλ―λ‘
λ€μ΅μ€νΈλΌ μκ³ λ¦¬μ¦μ μ΄μ©ν΄ νμ΄κ° κ°λ₯ν©λλ€.
보ν΅μ μ΅λ¨ κ²½λ‘λ₯Ό ꡬν λ μ²λΌ λ€μ΅μ€νΈλΌλ₯Ό μν ν μ΄λΈμ λ§λλλ€.
κ·Έλ¦¬κ³ λμ , 거리λ₯Ό μ€μ¬μΌλ‘ 보λ κ²μ΄ μλλΌ λ²½μ λΆμλ κ²μ μ€μ¬μΌλ‘
νμ¬ μμΉμμ κ° λ€μ μμΉ(λμλ¨λΆ)λ‘ μ΄λν λλ§λ€ λ μ΅μνμΌλ‘ λ²½μ λΆμκ³ μ΄λν μ μλ€λ©΄ κ°±μ ν΄μ£Όλ©΄ λ©λλ€.
if(distance[x][y] > distance[currentNode.x][currentNode.y]+maze[x][y] ){
distance[x][y] = distance[currentNode.x][currentNode.y]+maze[x][y];
priorityQueue.add(new Node(x,y,distance[x][y]));
}
π» μ½λ
package problem.shortest.Q1261;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.PriorityQueue;
public class Main_1261 {
static int moveX[] = {0,0,-1,1};
static int moveY[] = {-1,1,0,0};
static int maze[][];
static int distance[][];
static int n,m;
static class Node implements Comparable<Node>{
int x;
int y;
int distance;
public Node(int x, int y, int distance) {
this.x = x;
this.y = y;
this.distance = distance;
}
@Override
public int compareTo(Node target) {
// μμ 거리 λΉμ©μ΄ λ¨Όμ μ€λλ‘
return this.distance - target.distance;
}
}
public static void main(String[] args) throws IOException {
input();
solve();
System.out.println(distance[n-1][m-1]);
}
private static void input() throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String temp[] = br.readLine().split( " ");
m= Integer.parseInt(temp[0]);
n= Integer.parseInt(temp[1]);
maze = new int[n][m];
distance = new int[n][m];
for(int i=0; i<n; i++){
Arrays.fill(distance[i],Integer.MAX_VALUE);
}
for(int i=0; i<n; i++){
temp = br.readLine().split("");
for(int j=0; j<m; j++){
maze[i][j] = Integer.parseInt(temp[j]);
}
}
br.close();
}
private static void solve(){
PriorityQueue<Node> priorityQueue = new PriorityQueue<>();
priorityQueue.add(new Node(0,0,0));
distance[0][0] = 0;
while (! priorityQueue.isEmpty()){
Node currentNode = priorityQueue.poll();
if(currentNode.x == n-1 && currentNode.y == m-1){
return;
}
for(int i=0; i<4; i++){
int x = currentNode.x +moveX[i];
int y = currentNode.y + moveY[i];
if(x < 0 || y <0 || x >= n || y >= m){
continue;
}
if(distance[x][y] > distance[currentNode.x][currentNode.y]+maze[x][y] ){
distance[x][y] = distance[currentNode.x][currentNode.y]+maze[x][y];
priorityQueue.add(new Node(x,y,distance[x][y]));
}
}
}
}
}