STUDY πŸ’›/μ•Œκ³ λ¦¬μ¦˜

[BOJ] 4485 녹색 옷 μž…μ€ μ• κ°€ 저닀지? JAVA

DONI. 2021. 2. 15. 14:33
λ°˜μ‘ν˜•

[문제]

www.acmicpc.net/problem/4485

 

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]);
		}
	}
}

 

λ°˜μ‘ν˜•