It's easy, if you try

[goorm] 최소 이동 비용 (Java) / BFS / DP 본문

알고리즘/자바(Java)

[goorm] 최소 이동 비용 (Java) / BFS / DP

s5he2 2021. 6. 30. 23:19
반응형

문제

https://level.goorm.io/exam/82306/%EC%B5%9C%EC%86%8C-%EC%9D%B4%EB%8F%99-%EB%B9%84%EC%9A%A9/quiz/1

 

구름LEVEL

코딩테스트에서 가장 높은 비중을 차지하는 알고리즘 문제를 제작하고 풀이할 수 있는 온라인 저지 서비스입니다. 기업에서 선호하는 C, C++, 파이썬(Python), 자바(Java), 자바스크립트(Javascript) 이

level.goorm.io

풀이

import java.io.*;
import java.util.*;

class Main {
	static int[][] map;
	static int[][] dp;
	static int n, m;
	static int[] dx = {1, 0}; // 우, 하 이동
	static int[] dy = {0, 1};
	
	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		n = Integer.parseInt(st.nextToken());
		m = Integer.parseInt(st.nextToken());
		map = new int[n][m];
		dp = new int[n][m];
		
		for(int i=0; i< n; i++) {
			st = new StringTokenizer(br.readLine());
			for(int j=0; j < m; j++) {
				map[i][j] = Integer.parseInt(st.nextToken());
				dp[i][j] = Integer.MAX_VALUE;
			}
		}
		bfs(0,0);
		System.out.println(dp[n-1][m-1]);
	}
	
	private static void bfs(int x, int y) {
		Deque<int[]> dq = new ArrayDeque<>();
		dq.offer(new int[] {x, y});
		dp[x][y] = map[x][y];

		while(!dq.isEmpty()) {
			int nx, ny;
			int[] pos = dq.poll();
			for(int i=0; i<2; i++) {
				nx = pos[0] + dx[i];
				ny = pos[1] + dy[i];
				
				if(nx < 0 || nx >= n || ny < 0 || ny >= m) continue;
				if(dp[nx][ny] > map[nx][ny] + dp[pos[0]][pos[1]]) {
					dp[nx][ny] = dp[pos[0]][pos[1]] + map[nx][ny];
					dq.offer(new int[] {nx, ny});
				}
			}
		}
	}
}
반응형
Comments