[BOJ] 4485 λ Ήμ μ· μ μ μ κ° μ €λ€μ§? JAVA
[λ¬Έμ ]
4485λ²: λ Ήμ μ· μ μ μ κ° μ €λ€μ§?
μ €λ€μ μ μ€ κ²μμμ ννμ λ¨μλ 루νΌ(rupee)λ€. κ·Έλ°λ° κ°νΉ 'λλ루νΌ'λΌ λΆλ¦¬λ κ²μ μ 루νΌλ μ‘΄μ¬νλλ°, μ΄κ±Έ νλνλ©΄ μ€νλ € μμ§ν 루νΌκ° κ°μνκ² λλ€! μ €λ€μ μ μ€ μ리μ¦μ μ£Ό
www.acmicpc.net
μ €λ€μ μ μ€ κ²μμμ ννμ λ¨μλ 루νΌ(rupee)λ€. κ·Έλ°λ° κ°νΉ 'λλ루νΌ'λΌ λΆλ¦¬λ κ²μ μ 루νΌλ μ‘΄μ¬νλλ°, μ΄κ±Έ νλνλ©΄ μ€νλ € μμ§ν 루νΌκ° κ°μνκ² λλ€!
μ €λ€μ μ μ€ μ리μ¦μ μ£ΌμΈκ³΅, λ§ν¬λ μ§κΈ λλ루νΌλ§ κ°λν N x N ν¬κΈ°μ λκ΅΄μ μ μΌ μΌμͺ½ μμ μλ€. [0][0]λ² μΉΈμ΄κΈ°λ νλ€. μ μ΄λ° κ³³μ λ€μ΄μλκ³ λ¬»λλ€λ©΄ λ°μμ μ¬λλ€μ΄ μκΎΈ "μ €λ€μ μ μ€μ λμ€λ λ
Ήμ μ κ° μ €λ€μ§?"λΌκ³ λ¬Όμ΄λ΄€κΈ° λλ¬Έμ΄λ€. λ§ν¬κ° λ
Ήμ μ·μ μ
μ μ£ΌμΈκ³΅μ΄κ³ μ €λ€λ κ·Έλ₯ μ‘νμλ 곡주μΈλ°, κ²μ νμ΄νμ μ €λ€κ° λμμλ€κ³ μκΎΈ μ¬λλ€μ΄ μ΄λ κ² μ°©κ°νλκΉ μ μ λ³μ 걸릴 μκΈ°μ λμΈ κ²μ΄λ€.
νμ¬νΌ μ €λ€...μλ λ§ν¬λ μ΄ λκ΅΄μ λ°λνΈ μΆκ΅¬, μ μΌ μ€λ₯Έμͺ½ μλ μΉΈμΈ [N-1][N-1]κΉμ§ μ΄λν΄μΌ νλ€. λκ΅΄μ κ° μΉΈλ§λ€ λλ루νΌκ° μλλ°, μ΄ μΉΈμ μ§λλ©΄ ν΄λΉ λλ루νΌμ ν¬κΈ°λ§νΌ μμ§κΈμ μκ² λλ€. λ§ν¬λ μλ κΈμ‘μ μ΅μλ‘ νμ¬ λκ΅΄ 건λνΈκΉμ§ μ΄λν΄μΌ νλ©°, ν λ²μ μνμ’μ° μΈμ ν κ³³μΌλ‘ 1μΉΈμ© μ΄λν μ μλ€.
λ§ν¬κ° μμ μλ°μ μλ μ΅μ κΈμ‘μ μΌλ§μΌκΉ?
[μ
λ ₯]
μ
λ ₯μ μ¬λ¬ κ°μ ν
μ€νΈ μΌμ΄μ€λ‘ μ΄λ£¨μ΄μ Έ μλ€.
κ° ν
μ€νΈ μΌμ΄μ€μ 첫째 μ€μλ λκ΅΄μ ν¬κΈ°λ₯Ό λνλ΄λ μ μ Nμ΄ μ£Όμ΄μ§λ€. (2 ≤ N ≤ 125) N = 0μΈ μ
λ ₯μ΄ μ£Όμ΄μ§λ©΄ μ 체 μ
λ ₯μ΄ μ’
λ£λλ€.
μ΄μ΄μ Nκ°μ μ€μ κ±Έμ³ λκ΅΄μ κ° μΉΈμ μλ λλ루νΌμ ν¬κΈ°κ° 곡백μΌλ‘ ꡬλΆλμ΄ μ°¨λ‘λλ‘ μ£Όμ΄μ§λ€. λλ루νΌμ ν¬κΈ°κ° kλ©΄ μ΄ μΉΈμ μ§λλ©΄ k루νΌλ₯Ό μλλ€λ λ»μ΄λ€. μ¬κΈ°μ μ£Όμ΄μ§λ λͺ¨λ μ μλ 0 μ΄μ 9 μ΄νμΈ ν μ리 μλ€.
[μΆλ ₯]
κ° ν
μ€νΈ μΌμ΄μ€λ§λ€ ν μ€μ κ±Έμ³ μ λ΅μ νμμ λ§μΆ°μ μΆλ ₯νλ€. νμμ μμ μΆλ ₯μ μ°Έκ³ νμμ€.
* μΆμ² : ICPC > Regionals > North America > Pacific Northwest Regional > 2008 Pacific Northwest Region Programming Contest Dλ²
[Solution]
package boj4485_λ
Ήμμ·μ
μμ κ°μ €λ€μ§;
/* BFS + λ€μ΅μ€νΈλΌ
* */
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.PriorityQueue;
import java.util.StringTokenizer;
class Node implements Comparable<Node>{
int r, c, rupee;
public Node(int r, int c, int rupee) {
this.r = r;
this.c = c;
this.rupee = rupee;
}
@Override
public int compareTo(Node o) {
return rupee - o.rupee;
}
}
public class Main {
static int n;
static int[][] map;
static boolean[][] visited;
static int[][] resRupee;
static int[] dx = {0, 0, 1, -1};
static int[] dy = {1, -1, 0, 0};
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
//μμ cnt
int probCnt = 0;
while(true) {
probCnt++;
st = new StringTokenizer(br.readLine());
n = Integer.parseInt(st.nextToken()); //λκ΅΄ ν¬κΈ° n*n
//n=0 μ
λ ₯μ μ’
λ£
if(n == 0) return;
map = new int[n][n]; //λκ΅΄
visited = new boolean[n][n]; //μ’ν λ°©λ¬Έ ox
resRupee = new int[n][n]; //λ€μ΅μ€νΈλΌ κ²°κ³Όκ° arr
for(int i=0; i<n; ++i) {
//μ΅λ 거리κ°μΌλ‘ μ΄κΈ°ν
Arrays.fill(resRupee[i], n*125);
st = new StringTokenizer(br.readLine());
for(int j=0; j<n; ++j) {
map[i][j] = Integer.parseInt(st.nextToken());
}
}
PriorityQueue<Node> q = new PriorityQueue<Node>(); //루νΌκ° κΈ°μ€ μ€λ¦μ°¨μ μ λ ¬
q.add(new Node(0, 0, map[0][0])); //μμμ’ν λ
Έλμ 보 νμ μ½μ
resRupee[0][0] = map[0][0]; //(0,0)μμ μλ 루νΌκ°μ κ³ μ
while(!q.isEmpty()) {
Node node = q.poll();
int r = node.r;
int c = node.c;
int rupee = node.rupee;
if(visited[r][c] == true) continue; //λ°©λ¬Έν λ
Έλλ μ§λμΉ¨
visited[r][c] = true;
//μνμ’μ°
for(int i=0; i<4; ++i) {
int nr = r + dy[i];
int nc = c + dx[i];
//λ€μμ’ν(nr, nc)κ° λκ΅΄λ°°μ΄ λ΄?
if(nr>=0 && nr<n && nc>=0 && nc<n) {
//νμ¬μ’νμμ μλ λ£¨νΌ + λ€μμ’νμμ μλ λ£¨νΌ -> κ°μ₯ μμ κ° μ°ΎκΈ°
if(rupee + map[nr][nc] < resRupee[nr][nc]) {
resRupee[nr][nc] = rupee + map[nr][nc];
q.add(new Node(nr, nc, resRupee[nr][nc]));
}
}
}
}
System.out.println("Problem " + probCnt + ": " + resRupee[n-1][n-1]);
}
}
}