백준 17090 - 미로 탈출하기
알고리즘/백준

백준 17090 - 미로 탈출하기

[문제 바로가기]

 

1. 유형

dfs, 동적프로그래밍

 

2. 문제 분석

 

2-1. 설계

 

2-2. 설명

가장 먼저 떠오른 생각은 완전 탐색 입니다. 하지만 500^4을 하면 1억이 넘어가 시간초과가 나옵니다.

따라서 메모리제이션을 통해 한번 탐색한 길은 또 탐색하지 않도록 하는 방법으로 풀이했습니다.

 

범위를 나가서 한번 검증된 길은 1을 저장하고, 잘못된 길은 0을 리턴해서

굳이 끝까지 가지 않더라도 길의 종착지가 어떤지를 확인 가능합니다.

 

3. 코드

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

public class Main {
	static int N,M, dp[][];
	public static void main(String[] args) throws IOException {
		BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(in.readLine());
		N = stoi(st.nextToken());
		M = stoi(st.nextToken());
		char map[][] = new char[N][M];
		dp = new int[N][M];
		for (int i = 0; i < N; i++) {
			st = new StringTokenizer(in.readLine());
			String s = st.nextToken();
			map[i] = s.toCharArray();
		}
		int cnt=0;
		int visit[][]=new int[N][M];
		for (int i = 0; i < N; i++) {
			for (int j = 0; j < M; j++) {
				if(visit[i][j]==0) {
					visit[i][j]=1;
					dp[i][j]=dfs(i, j, visit, map);
				}
			}
		}
		for(int i=0; i<N; i++) {
			for(int j=0; j<M; j++) {
				if(dp[i][j]==1)
					cnt++;
			}
		}
		System.out.println(cnt);
	}
	static int dfs(int r, int c, int visit[][], char map[][]) {
		if(map[r][c]=='U') {
			r--;			
		}else if(map[r][c]=='R') {
			c++;
		}else if(map[r][c]=='D') {
			r++;
		}else if(map[r][c]=='L') {
			c--;
		}
		if(r<0 || r>=N || c<0 ||c>=M) {
			return 1;
		}
		if(visit[r][c]==1) {
			if(dp[r][c]==0) {
				return 0;
			}else {
				return 1;
			}
		}else {
			visit[r][c]=1;
			dp[r][c]= dfs(r, c, visit, map);
			return dp[r][c];
		}
	}
	static int stoi(String s) {
		return Integer.valueOf(s);
	}
}

 

 

'알고리즘 > 백준' 카테고리의 다른 글

백준 16202 - MST게임  (0) 2021.09.08
백준 - 2406 안정적인 네트워크  (0) 2021.09.07
백준 1747 - 소수&팰린드롬  (0) 2021.09.02
백준 13459 - (Java) 구슬 탈출  (0) 2021.08.31
백준 14923 - (Java) 미로 탈출  (0) 2021.08.29