https://www.acmicpc.net/problem/14442

 

14442๋ฒˆ: ๋ฒฝ ๋ถ€์ˆ˜๊ณ  ์ด๋™ํ•˜๊ธฐ 2

์ฒซ์งธ ์ค„์— N(1 โ‰ค N โ‰ค 1,000), M(1 โ‰ค M โ‰ค 1,000), K(1 โ‰ค K โ‰ค 10)์ด ์ฃผ์–ด์ง„๋‹ค. ๋‹ค์Œ N๊ฐœ์˜ ์ค„์— M๊ฐœ์˜ ์ˆซ์ž๋กœ ๋งต์ด ์ฃผ์–ด์ง„๋‹ค. (1, 1)๊ณผ (N, M)์€ ํ•ญ์ƒ 0์ด๋ผ๊ณ  ๊ฐ€์ •ํ•˜์ž.

www.acmicpc.net

 

 

 

 

 

๋ฌธ์ œ

  • Nร—M์˜ ํ–‰๋ ฌ๋กœ ํ‘œํ˜„๋˜๋Š” ๋งต์ด ์žˆ๋‹ค. ๋งต์—์„œ 0์€ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ๊ณณ, 1์€ ๋ฒฝ์ด ์žˆ๋Š” ๊ณณ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.
  • (1, 1)์—์„œ (N, M)์˜ ์œ„์น˜๊นŒ์ง€ ์ด๋™ํ•˜๋ ค ํ•˜๋Š”๋ฐ, ์ตœ๋‹จ ๊ฒฝ๋กœ๋กœ ์ด๋™ํ•˜๋ ค ํ•œ๋‹ค.
    • ํ•œ ์นธ์—์„œ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ์นธ์€ ์ƒํ•˜์ขŒ์šฐ๋กœ ์ธ์ ‘ํ•œ ์นธ
  • ํ•œ ๊ฐœ์˜ ๋ฒฝ์„ ๋ถ€์ˆ˜๊ณ  ์ด๋™ํ•˜๋Š” ๊ฒƒ์ด ์ข€ ๋” ๊ฒฝ๋กœ๊ฐ€ ์งง์•„์ง„๋‹ค๋ฉด, ๋ฒฝ์„ K๊ฐœ ๊นŒ์ง€ ๋ถ€์ˆ˜๊ณ  ์ด๋™ํ•˜์—ฌ๋„ ๋œ๋‹ค.
  • ์ฒซ์งธ ์ค„์— ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค. ๋ถˆ๊ฐ€๋Šฅํ•  ๋•Œ๋Š” -1์„ ์ถœ๋ ฅํ•œ๋‹ค.

 

 

 

 

 

ํ’€์ด

๋ฒฝ ๋ถ€์ˆ˜๊ณ  ์ด๋™ํ•˜๊ธฐ ์‹œ๋ฆฌ์ฆˆ์˜ ๋ฌธ์ œ์ด๋‹ค. 1์—์„œ๋Š” ๋ฒฝ์„ ํ•œ ๊ฐœ ๊นŒ์ง€ ๋ถ€์ˆ˜๊ณ  ์ด๋™ํ–ˆ์ง€๋งŒ, ์ด ๋ฌธ์ œ์—์„œ๋Š” K๊ฐœ๊นŒ์ง€ ๋ถ€์ˆ˜๊ณ  ์ด๋™ํ•œ๋‹ค.

 

https://www.acmicpc.net/problem/2206

 

2206๋ฒˆ: ๋ฒฝ ๋ถ€์ˆ˜๊ณ  ์ด๋™ํ•˜๊ธฐ

Nร—M์˜ ํ–‰๋ ฌ๋กœ ํ‘œํ˜„๋˜๋Š” ๋งต์ด ์žˆ๋‹ค. ๋งต์—์„œ 0์€ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ๊ณณ์„ ๋‚˜ํƒ€๋‚ด๊ณ , 1์€ ์ด๋™ํ•  ์ˆ˜ ์—†๋Š” ๋ฒฝ์ด ์žˆ๋Š” ๊ณณ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค. ๋‹น์‹ ์€ (1, 1)์—์„œ (N, M)์˜ ์œ„์น˜๊นŒ์ง€ ์ด๋™ํ•˜๋ ค ํ•˜๋Š”๋ฐ, ์ด๋•Œ ์ตœ๋‹จ ๊ฒฝ๋กœ

www.acmicpc.net

 

 

 

๊ทธ๋ž˜์„œ ๋ฒฝ ๋ถ€์ˆ˜๊ณ  ์ด๋™ํ•˜๊ธฐ์˜ ๋ฌธ์ œ ํ’€์ด์™€ ์œ ์‚ฌํ•˜๋‹ค.

https://programmingiraffe.tistory.com/145

 

๋ฐฑ์ค€ - 2206๋ฒˆ : ๋ฒฝ๋ถ€์ˆ˜๊ณ  ์ด๋™ํ•˜๊ธฐ

https://www.acmicpc.net/problem/2206 2206๋ฒˆ: ๋ฒฝ ๋ถ€์ˆ˜๊ณ  ์ด๋™ํ•˜๊ธฐ Nร—M์˜ ํ–‰๋ ฌ๋กœ ํ‘œํ˜„๋˜๋Š” ๋งต์ด ์žˆ๋‹ค. ๋งต์—์„œ 0์€ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ๊ณณ์„ ๋‚˜ํƒ€๋‚ด๊ณ , 1์€ ์ด๋™ํ•  ์ˆ˜ ์—†๋Š” ๋ฒฝ์ด ์žˆ๋Š” ๊ณณ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค. ๋‹น์‹ ์€ (1, 1)์—

programmingiraffe.tistory.com

 

 

 

 

 

 ์ƒํ•˜์ขŒ์šฐ ์ธ์ ‘ํ•œ ์นธ์œผ๋กœ ํ•œ ์นธ์”ฉ ์ด๋™ํ–ˆ์„ ๋•Œ์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ๋กœ, ํ•œ ์นธ์”ฉ ์ด๋™ํ•˜๋ฉฐ ์‚ฌ๋ฐฉํƒ์ƒ‰์„ ํ†ตํ•ด ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜์— ๋Œ€ํ•ด ์‚ดํ”ผ๊ณ  ๋ชฉํ‘œ ์ง€์ ์— ๋„๋‹ฌํ–ˆ์„์‹œ ํƒ์ƒ‰์„ ์ข…๋ฃŒํ•ด์•ผ ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ํ๋ฅผ ์ด์šฉํ•œ BFS ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ํ’€์—ˆ๋‹ค.

 

 

 

1. ๋ฒฝ์„ ์ง€๊ธˆ๊นŒ์ง€ ๋ช‡ ๊ฐœ ๋ถ€์‰ˆ๋Š”์ง€ ์ •๋ณด ์ €์žฅ

 

 ํ์— ์ขŒํ‘œ ์ •๋ณด๋ฅผ ๋„ฃ์„ ๋•Œ, ํ–‰๋ ฌ ์ขŒํ‘œ๊ฐ’, ์ด๋™ ๊ฑฐ๋ฆฌ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ง€๊ธˆ๊นŒ์ง€ ๋ช‡ ๊ฐœ์˜ ๋ฒฝ์„ ๋ถ€์ˆœ์ ์ด ์žˆ๋Š”์ง€ ์ •๋ณด๋ฅผ ์ €์žฅํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ขŒํ‘œ ์ •๋ณด๋ฅผ ๋‹ด๋Š” Point๋ผ๋Š” ๊ฐ์ฒด์— int ํ˜•์˜ ๋ณ€์ˆ˜(hit)์„ ์ถ”๊ฐ€ํ•ด์คฌ๋‹ค.

 

 

 

2. ๋ฐฉ๋ฌธ์ฒดํฌ : boolean[K][N][M]

 

 ๋ฐฉ๋ฌธ์ฒดํฌ๋ฅผ ํ•  ๋•Œ, ํ—ค๋‹น ์ง€์ ์— ๋Œ€ํ•ด ์ง€๊ธˆ๊นŒ์ง€ ๋ฒฝ์„ ๋ช‡ ๋ฒˆ ๋ถ€์ˆ˜๊ณ  ๋ฐฉ๋ฌธํ–ˆ๋Š”๊ฐ€ ์•ˆํ–ˆ๋Š”๊ฐ€๋ฅผ ํ‘œ์‹œํ–ˆ๋‹ค. ํ•ด๋‹น ์ง€์ ์— ํ•œ๋ฒˆ๋„ ์•ˆ๋ถ€์ˆ˜๊ณ  ๋ฐฉ๋ฌธํ•  ์ˆ˜๋„ ์žˆ๊ณ , 1๋ฒˆ ๋ถ€์ˆ˜๊ณ  ๋ฐฉ๋ฌธํ•  ์ˆ˜๋„ ์žˆ๊ณ , .. K๋ฒˆ ๋ถ€์ˆ˜๊ณ  ๋ฐฉ๋ฌธํ•  ์ˆ˜๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋จผ์ € n๋ฒˆ ๋ถ€์ˆ˜๊ณ  ๋ฐฉ๋ฌธํ–ˆ์–ด๋„ ํ›„์— ๊ทธ ๊ฒฝ๋กœ๊ฐ€ ๋”์ด์ƒ ํƒ์ƒ‰์ด ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ฒฝ๋กœ๊ฐ€ ๋  ์ˆ˜๋„ ์žˆ๋‹ค.

 

 

* ๋ฐฑ์ค€์˜ ๋ฌธ์ œ ๋‚ด ๊ฒŒ์‹œํŒ์—์„œ ๋ณธ๊ฑด๋ฐ, ๋ฐฐ์—ด์˜ ์ฐจ์› ์„ ์–ธ ์ˆœ์„œ๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์™€ ์ˆ˜ํ–‰์‹œ๊ฐ„์— ์˜ํ–ฅ์„ ๋ฏธ์นœ๋‹ค๊ณ  ํ•œ๋‹ค. 

(https://www.acmicpc.net/board/view/111938)

 

visited[11][1000][1000]๊ฐ€ visited[1000][1000][11] ๋ณด๋‹ค ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์ด ํ›จ์”ฌ ์ ๋‹ค. ์ฑ„์ ์„ ๋Œ๋ ธ์„ ๋•Œ๋„ 500ms ์ •๋„ ์ฐจ์ด๊ฐ€ ๋‚ฌ๋‹ค.

 

 

 

3. ๋ฒฝ์ธ์ง€ ๋ฒฝ์ด ์•„๋‹Œ์ง€์— ๋”ฐ๋ผ ํƒ์ƒ‰์„ ๋‹ค๋ฅด๊ฒŒ ํ–ˆ๋‹ค.

 

  • ๋ฒฝ์ด ์•„๋‹ˆ๋‹ค
    • ์ง€๊ธˆ๊นŒ์ง€ n๊ฐœ ๋ถ€์ˆด ๋ฐฉ๋ฌธํ•œ์ ์ด ์—†์Œ => n๊ฐœ ๊ทธ๋Œ€๋กœ ํƒ์ƒ‰
  • ๋ฒฝ์ด๋‹ค
    • ์ง€๊ธˆ๊นŒ์ง€ K๊ฐœ ๋ฏธ๋งŒ ๋ถ€์ˆจ
    • ์ง€๊ธˆ๊นŒ์ง€ n +1๊ฐœ ๋ถ€์ˆด ๋ฐฉ๋ฌธํ•œ์ ์ด ์—†์Œ=> n+1 ๋ถ€์ˆ˜๊ณ  ํƒ์ƒ‰

 

 

 

 

 

์ฝ”๋“œ

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

public class Main {
	static int N, M, K;
	static int[][] graph;
	static boolean[][][] visited;
	static int[] dx = {-1, 1, 0, 0};
	static int[] dy = {0, 0, -1, 1};
	
	static class Point {
		int x;
		int y;
		int count;
		int hit;
		
		public Point(int x, int y, int count, int hit) {
			this.x = x;
			this.y = y;
			this.count = count;
			this.hit = hit;
		}
	}
	
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		StringTokenizer st = new StringTokenizer(br.readLine(), " ");
		N = Integer.parseInt(st.nextToken());
		M = Integer.parseInt(st.nextToken());
		K = Integer.parseInt(st.nextToken());
		
		graph = new int[N + 1][M + 1];
		visited = new boolean[K + 1][N + 1][M + 1]; //0 : ๋ฒฝ ์•ˆ๋ถ€์ˆจ, 1~K: ๋ฒฝ n๊ฐœ ๋ถ€์ˆจ
		
		for(int i = 1; i <= N; i++) {
			String row = br.readLine();
			
			for(int j = 1; j <= M; j++) {
				graph[i][j] = row.charAt(j - 1) - '0';
			}
		}
		
		int answer = bfs(1, 1);
		
		System.out.println(answer);
	}
	
	public static int bfs(int i, int j) {
		Queue<Point> queue = new LinkedList<>();
		
		queue.add(new Point(i, j, 1, 0));
		visited[0][i][j] = true;
		
		while(!queue.isEmpty()) {
			Point point = queue.poll();
			
			if(point.x == N && point.y == M) { // ์ข…๋ฃŒ ์กฐ๊ฑด
				return point.count;
			}
			
			for(int d = 0; d < 4; d++) {
				int nx = point.x + dx[d];
				int ny = point.y + dy[d];
				
				if(1 <= nx && nx <= N && 1 <= ny && ny <= M) {
					if(graph[nx][ny] == 0 && !visited[point.hit][nx][ny]) { //๋ฒฝ ์•„๋‹˜
						queue.add(new Point(nx, ny, point.count + 1, point.hit));
						visited[point.hit][nx][ny] = true;
					}else if(graph[nx][ny] == 1 && point.hit < K && !visited[point.hit + 1][nx][ny]) { //๋ฒฝ ์žˆ์Œ, k๊ฐœ ๋ฏธ๋งŒ ๋ถ€์ˆจ, n+1๋ถ€์ˆ˜๊ณ  ๋ฐฉ๋ฌธํ•œ์  ์—†์Œ
						queue.add(new Point(nx, ny, point.count + 1, point.hit + 1)); //๋ฒฝ ๋ถ€์ˆ˜๊ธฐ
						visited[point.hit + 1][nx][ny] = true;
					}
				}
			}
		}
		
		return -1;
	}

}

 

 

 

 

 

๊ฒฐ๊ณผ

 

1480ms ๊ฑธ๋ฆฌ๋Š” ๊ฒฐ๊ณผ : visited[11][1000][1000]

1992ms ๊ฑธ๋ฆฌ๋Š” ๊ฒฐ๊ณผ : visited[1000][1000][11]

 

 

 

 

 

๋ฐฐ์šด์ 

  • 3์ฐจ์› ๋ฐฉ๋ฌธ์ฒดํฌ
    • visited[11][1000][1000] ๊ฐ€ visited[1000][1000][11] ๋ณด๋‹ค ์‹œ๊ฐ„์ด ์ ๊ฒŒ ๋“ ๋‹ค
giraffe_