스터디/알고리즘 스터디

[백준 알고리즘] 2178 미로 탐색 (21.05.02)

sleesm 2021. 5. 2. 20:49

이전 이야기 ....

 

2021.05.02 - [알고리즘 스터디] - [백준 알고리즘] 11724 연결 요소의 개수 (21.05.02)

 

[백준 알고리즘] 11724 연결 요소의 개수 (21.05.02)

이전 이야기 .... 2021.05.02 - [알고리즘 스터디] - [백준 알고리즘] 2606 바이러스 (21.05.02) [백준 알고리즘] 2606 바이러스 (21.05.02) 오늘은 원래 구현 이었으나 .... 굳이 스터디로 안 해도 될 것 같아 BF..

sleecode.tistory.com

 

 

 

오늘은 무려 40분을 일찍 끝내버려서

 

아쉬운? 마음에

 

1문제를 더 풀었습니다!!!!!!!!

.

.

.

 

 

 

그래서 

 

마지막 문제는 오랜만에 미로 탐색!!!

 

 

백준 2178 미로 탐색

 

 

입력

첫째 줄에 두 정수 N, M(2 ≤ N, M ≤ 100)이 주어진다. 다음 N개의 줄에는 M개의 정수로 미로가 주어진다. 각각의 수들은 붙어서 입력으로 주어진다.

 

출력

첫째 줄에 지나야 하는 최소의 칸 수를 출력한다. 항상 도착위치로 이동할 수 있는 경우만 입력으로 주어진다.

 

 

문제 사이트 : www.acmicpc.net/problem/2178

 

2178번: 미로 탐색

첫째 줄에 두 정수 N, M(2 ≤ N, M ≤ 100)이 주어진다. 다음 N개의 줄에는 M개의 정수로 미로가 주어진다. 각각의 수들은 붙어서 입력으로 주어진다.

www.acmicpc.net

 

 


 

여기서 핵심 포인트!!!

 

 

-  Maze 구현!!

 

- 탐색을 어떻게 할 것인가?

 


 

 

 

 

직접 작성해본 소스코드 및 간단한 설명

 

import java.util.Scanner;

public class Maze { //2178
	
	private static int[][] maze;
	private static int row, col;
	private static boolean done = false;
	private static int count = 0;
	
	static boolean isValid(int r, int c) {
		System.out.println("r : " +r +" c : "+c);
		if( r < 0 || c < 0 || r >= row || c >= col) return false;
		else return (maze[r][c] == 1 || maze[r][c] == 3);
	}
	
	static void search(int r, int c) {
		if(done) return;
		if(r == row && c == col) {
			done = true;
			return;
		}
		
		maze[r][c] = 2;
		count++;
		if(isValid(r-1,c)) search(r-1,c);
		if(isValid(r,c-1)) search(r,c-1);
		if(isValid(r+1,c)) search(r+1,c);
		if(isValid(r,c+1)) search(r,c+1);
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		Scanner sc = new Scanner(System.in);
		row = sc.nextInt();
		col = sc.nextInt();
		
		maze = new int[row][col];
		
		String tmp = null;
		for(int i = 0; i< row; i++) {
			tmp = sc.next();
			String [] ary = tmp.split("");
			for(int j = 0; j< ary.length; j++) {
				maze[i][j]= Integer.parseInt(ary[j]);
			}
		}
		maze[row-1][col-1] = 3;
		
		search(0,0);
		
		System.out.println(count);
		
	}

}

 

 

사실 이건 미완성 코드인데

왜냐하면 Maze 만 구현해놓고

 

 

 

최소 탐색을 안 해놨기 때문!!!!!!!!

 

 

 

 

 

 

 

그러므로,, 딱히 할 말이 없다................................................

 

 

 

.

.

.

 

 

 

 

 

 

시간 부족으로 다른 친구들도 못했으므로

 

할 말이 더 없다....

 

 

 

 

 

 

 

 

 

그럼 이번주는 이걸로 끝!!!!!!!

 

 

빈센조 보러 가야지^_^ 오늘이 마지막회다^_^

 

 

 

 



 

 

210508

 

알고리즘 스터디 깃헙에 올리기

 

2시간쯤 전 ㅎㅎ...

 

 

 

 

 

수정한 소스코드 및 간단한 설명

import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
	
class Point {
	int x;
	int y;

	Point(int x, int y) {
		this.x = x;
		this.y = y;
	}
}

public class Maze { //2178
	
	private static int[][] maze;
	private static int row, col;
	private static boolean[][] visited;
    static int[] dx = { -1, 0, 1, 0 };
    static int[] dy = { 0, -1, 0, 1 };

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		Scanner sc = new Scanner(System.in);
		row = sc.nextInt();
		col = sc.nextInt();
		
		maze = new int[row][col];
		visited = new boolean[row][col];
		
		String tmp = null;
		for(int i = 0; i< row; i++) {
			tmp = sc.next();
			String [] ary = tmp.split("");
			for(int j = 0; j< ary.length; j++) {
				maze[i][j]= Integer.parseInt(ary[j]); // tmp.charAt(j)-'0'; 도 같은 기능!
				visited[i][j] = false;
			}
		}
		
		visited[0][0] = true;
		BFS(0,0);
		System.out.println(maze[row-1][col-1]);
	}

	
	private static void BFS(int x, int y) {
		Queue<Point> q = new LinkedList<Point>();
        q.add(new Point(x, y));
        while (!q.isEmpty()) {
        	Point d = q.poll();
            for (int i = 0; i < 4; i++) {
                int nextX = d.x + dx[i];
                int nextY = d.y + dy[i];
                
                if (nextX < 0 || nextY < 0 || nextX >= row || nextY >= col) {
                    continue;
                }
                if (visited[nextX][nextY] || maze[nextX][nextY] == 0) {
                    continue;
                }
                q.add(new Point(nextX, nextY));
                
                maze[nextX][nextY] = maze[d.x][d.y] + 1;
                
                visited[nextX][nextY] = true;
            }
        }
	}


}

 

 

이번 코드의 중요 포인트는 바로바로

 

 

 

  • DFS보다 BFS를 사용하는 것이 좋다!!!! (성능 상 더 좋음)

 

  • JAVA에서 .charAt(j)-'0' 을 사용하면 숫자가 나온다는 점!!

 

  • 따로 카운팅하는 대신 maze 배열에 카운트하기!!

 

 

 

 

 

 


 

 

 

백준 알고리즘

 

채점 결과!!!

 

 

 

다행히 맞았습니다!!

 

 

백준 알고리즘 2178번 채점 결과

 

 

 

 

 

 


 

 

 

 

이번 코드는 너무 어려워서 ....

.

.

.

 

 

서칭을 많이 했다 ^^

 

 

 

 

 

 

 

 

 

 

 

 

 

 

그래서 참고한 블로그들을 첨부하자면,

 

 

zoonvivor.tistory.com/77

 

[BOJ] 백준 2178 - 미로찾기 (자바)

단순 BFS 문제이다. BFS 문제로는 어렵지 않다. 근데 나는 DFS로 풀고 싶은데 시간초과 안나게 어떻게 해야할지 모르겠다... 그리고 헷갈리는건 +1만 해주면 끝일까? Queue를 이용하기 때문에 먼저 방

zoonvivor.tistory.com

velog.io/@juhyun7793/%EB%B0%B1%EC%A4%80-2178-%EB%AF%B8%EB%A1%9C%EC%B0%BE%EA%B8%B0-Java

 

백준 2178 미로찾기 (Java)

풀이 최단거리를 찾는 기본 문제로 BFS를 활용하여 푸는 문제이다. 최초 기점 (0,0)부터 BFS를 돌려 (N-1,M-1)까지 도달하는 거리를 점진적으로 ++시키며 확장하여 마지막 지점까지 갔을 경우 출력하

velog.io

 

 

 

 

그리고 좀 더 자세한 설명을 원한다면

 

 

 

우리 공희의 블로그를 보시길 바랍니다!!!!!!!!!!!!!

 

blog.naver.com/judy6647/222238274549

 

PART 02 [실전 문제 #4] DFS/BFS_ 미로 탈출

난이도 ●○○ | 풀이 시간 30분 | 시간 제한 1초 | 메모리 제한 128MB <문제 내용> N x M 크기...

blog.naver.com

 

 

아주 잘 설명되어있기 때문!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

그렇다면 안녕!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!