알고리즘문제풀이

[JAVA] SWEA 1226 미로1 [BFS, DFS]

Hindsight.. 2020. 8. 17. 21:21

전체 코드

import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;

public class SWEA_1226_미로1 {

	static int[] dy = { 1, -1, 0, 0 }; //상, 하, 우, 좌
	static int[] dx = { 0, 0, 1, -1 };
	static int chk; //도달유무 체크값

	static class Point{ // bfs 사용시 필요한 좌표 클래스
		int y, x;
		Point(int y, int x){
			this.y = y;
			this.x = x;
		}
	}
	
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);

		for (int test = 1; test <= 10; test++) {
			String trash = sc.next(); //쓰레기값 버리기
			char[][] arr = new char[16][16]; // 값 배열
			boolean[][] v = new boolean[16][16]; // 방문 체크 boolean 배열

			for (int i = 0; i < 16; i++) {
				arr[i] = sc.next().toCharArray();
			}

			chk = 0;
			v[1][1] = true;
			bfs(arr, v);
//			dfs(1, 1, arr, v);
			System.out.println("#" + test + " " + chk);

		}
	}

	private static void bfs(char[][] arr, boolean[][] v) { //BFS
		Queue<Point> q = new LinkedList<Point>(); // Queue 선언
		q.add(new Point(1, 1)); // 시작 좌표는 모든 경우가 (1,1)이므로 첫좌표로 넣어주고 시작
		v[1][1] = true; // 1,1 방문체크
		
		while(!q.isEmpty()) {
			Point p = q.poll(); //q의 끝값을 poll
			for(int i=0; i<4; i++) { //사방 체크
				int ry = p.y + dy[i];
				int rx = p.x + dx[i];
				if(ry>=0 && ry<16 && rx>=0 && rx<16 && !v[ry][rx]) { // ry, rx가 인덱스 내이고, 방문이 안되어있다면
					if(arr[ry][rx] == '3') { // 만약 값이 3이면 chk를 1로 하고 종료
						chk = 1;
						return;
					}else if(arr[ry][rx] == '0') { // 0이라면, 방문체크 후 q에 넣어준다.
						v[ry][rx] = true;
						q.add(new Point(ry, rx));
					} // 1은 자연스럽게 무시된다.
				}
			}
		}
		
	}
	private static void dfs(int y, int x, char[][] arr, boolean[][] v) {
		if(arr[y][x] == '3') {
			chk = 1;
			return;
		}
		for (int i = 0; i < 4; i++) {
			int ry = y + dy[i];
			int rx = x + dx[i];
			if(ry>=0 && ry<16 && rx>=0 && rx<16 && !v[ry][rx]) { // ry, rx가 인덱스 내이고, 방문이 안되어있다면
				if(arr[ry][rx] == '3') { // 만약 값이 3이면 chk를 1로 하고 종료
					chk = 1;
					return;
				}else if(arr[ry][rx] == '0') { // 0이라면
					v[ry][rx] = true; // 방문 체크 후
					dfs(ry, rx, arr, v); // 재귀
					v[ry][rx] = false; // 재귀 끝난 후 다시 false로 변환 후 진행
				} // 1은 자연스럽게 무시된다.
			}
		}
	}

}

 

문제 핵심 코드

 

BFS

private static void bfs(char[][] arr, boolean[][] v) { //BFS
	Queue<Point> q = new LinkedList<Point>(); // Queue 선언
	q.add(new Point(1, 1)); // 시작 좌표는 모든 경우가 (1,1)이므로 첫좌표로 넣어주고 시작
	v[1][1] = true; // 1,1 방문체크
	
	while(!q.isEmpty()) {
		Point p = q.poll(); //q의 끝값을 poll
		for(int i=0; i<4; i++) { //사방 체크
			int ry = p.y + dy[i];
			int rx = p.x + dx[i];
			if(ry>=0 && ry<16 && rx>=0 && rx<16 && !v[ry][rx]) { // ry, rx가 인덱스 내이고, 방문이 안되어있다면
				if(arr[ry][rx] == '3') { // 만약 값이 3이면 chk를 1로 하고 종료
					chk = 1;
					return;
				}else if(arr[ry][rx] == '0') { // 0이라면, 방문체크 후 q에 넣어준다.
					v[ry][rx] = true;
					q.add(new Point(ry, rx));
				} // 1은 자연스럽게 무시된다.
			}
		}
	}
	
}

 

DFS

private static void dfs(int y, int x, char[][] arr, boolean[][] v) {
	if(arr[y][x] == '3') {
		chk = 1;
		return;
	}
	for (int i = 0; i < 4; i++) {
		int ry = y + dy[i];
		int rx = x + dx[i];
		if(ry>=0 && ry<16 && rx>=0 && rx<16 && !v[ry][rx]) { // ry, rx가 인덱스 내이고, 방문이 안되어있다면
			if(arr[ry][rx] == '3') { // 만약 값이 3이면 chk를 1로 하고 종료
				chk = 1;
				return;
			}else if(arr[ry][rx] == '0') { // 0이라면
				v[ry][rx] = true; // 방문 체크 후
				dfs(ry, rx, arr, v); // 재귀
				v[ry][rx] = false; // 재귀 끝난 후 다시 false로 변환 후 진행
			} // 1은 자연스럽게 무시된다.
		}
	}
}

 

이번 문제는 DFS와 BFS가 모두 가능했다. 단순한 경로 찾기 문제여서 가능했다.

 

가능한 경로 문제들은 DFS와 BFS 모두 시도해 보는게 연습에 좋은 영향을 끼치는 것 같다!