๋ณธ๋ฌธ์œผ๋กœ ๋ฐ”๋กœ๊ฐ€๊ธฐ

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV4yLUiKDUoDFAUx 

 

SW Expert Academy

SW ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์—ญ๋Ÿ‰ ๊ฐ•ํ™”์— ๋„์›€์ด ๋˜๋Š” ๋‹ค์–‘ํ•œ ํ•™์Šต ์ปจํ…์ธ ๋ฅผ ํ™•์ธํ•˜์„ธ์š”!

swexpertacademy.com


1. ๋ฌธ์ œ ์š”์•ฝ

์ˆ˜ํ–‰๋ช…๋ น๋Œ€๋กœ ์ด๋™ํ•œ๋‹ค, ์ •์ง€ํ•  ์ˆ˜ ์žˆ์œผ๋ฉด YES, ์ •์ง€ํ•  ์ˆ˜ ์—†๋‹ค๋ฉด NO๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

 

2. ํ’€์ด

22.11.13 - BFS ํ’€์ด

BFS ๋กœ ํ’€์—ˆ๋‹ค.

์ฒ˜์Œ์— DFS๋กœ ํ’€๋‹ค๊ฐ€ ํ„ฐ์ ธ์„œ ์ ‘๊ณ  BFS๋กœ ๋ฐ”๊ฟ”์„œ ํ’€์—ˆ๋”๋‹ˆ ์ž๊พธ ํ…Œ์ผ€ 65/69๋งŒ ๋–ด๋‹ค

(์นœ๊ตฌ๋Š” DFS๋กœ ํ’€์—ˆ๋‹ค. ์˜ค๋Š˜ ์บ ํผ์Šค ๊ฐ€์„œ DFS๋กœ ํ’€์–ด๋ณผ ๊ฒƒ์ด๋‹ค. ํ’€์ด ์˜ฌ๋ฆฌ๊ฒ ์Œ)

ํ…Œ์ผ€ 4๊ฐœ๊ฐ€ ํ†ต๊ณผ ๋ชปํ•œ ์ด์œ ๋Š” ? ๋…€์„ ๋•Œ๋ฌธ์ด๋‹ค

4๋ฐฉํ–ฅ์˜ ๊ฒฝ์šฐ๋ฅผ ๋ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ•œ ๋ฐฉํ–ฅ ๋ดค๋‹ค๊ฐ€ ์›๋ณต์„ ์‹œ์ผœ์ค˜์•ผ ํ•œ๋‹ค.

 

1. ๋ฉ”๋ชจ๋ฆฌ ํฌ๊ธฐ๋ฅผ ์›๋ณต์‹œ์ผœ์ฃผ์ง€ ์•Š์•˜๋‹ค.

=> ์›๋ณต์‹œํ‚ค๋Š”๋ฐ ๊นŒ๋‹ค๋กœ์šฐ๋‹ˆ๊นŒ ๊ทธ๋ƒฅ ํด๋ž˜์Šค์— ์ถ”๊ฐ€ํ•ด์„œ ๋“ค๊ณ ๋‹ค๋‹ˆ๊ฒŒ ํ–ˆ๋‹ค.

2. ๋ฐฉ๋ฌธํ•  ๋•Œ y์ขŒํ‘œ, x์ขŒํ‘œ, ๋ฐฉํ–ฅ ๊ทธ๋ฆฌ๊ณ  ๋ฉ”๋ชจ๋ฆฌํฌ๊ธฐ์— ๋”ฐ๋ผ ๋ฐฉ๋ฌธ ์ง€์ ์ด ๋‹ฌ๋ผ์ง„๋‹ค.

=> ๋ฉ”๋ชจ๋ฆฌ ํฌ๊ธฐ์— ๋”ฐ๋ผ ๋ฐฉํ–ฅ์ด ๋ฐ”๋€” ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ทธ๋ž˜์„œ visited๋ฅผ 4์ฐจ์›์œผ๋กœ ํ•ด์ค˜์•ผ ํ•œ๋‹ค. visited[y][x][d][mem]

3. ๋ฐฉ๋ฌธํ•œ ์ง€์ ์„ ๋˜ ๋ฐฉ๋ฌธํ–ˆ์„ ๋•Œ ๋ฐ”๋กœ return ํ•ด์ฃผ๋ฉด ์•ˆ๋œ๋‹ค.

=> 4๋ฐฉํ–ฅ์„ ๋ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— continueํ•ด์„œ ๋‹ค์Œ ๋ฐฉํ–ฅ์œผ๋กœ ๋„˜์–ด๊ฐ€์•ผ ํ•œ๋‹ค.

๋‚˜๋Š” ํ•œ ๋ฐฉํ–ฅ๋งŒ ๋ณด๊ณ  returnํ•ด์คฌ๊ธฐ ๋•Œ๋ฌธ์— ๋‹น์—ฐํžˆ ํ‹€๋ฆฐ ๋‹ต์ด์—ˆ๋‹ค. 

 

 

22.11.15 - DFS ํ’€์ด

DFS(๋ฐฑํŠธ๋ž˜ํ‚น) ์œผ๋กœ ํ’€์—ˆ๋‹ค.

๊ธฐ์ €์กฐ๊ฑด์€ 

1) @์ผ ๋•Œ (=> ์ƒํƒœ true๋กœ ๋ฐ”๊ฟ”์ฃผ๊ณ  ๋ฆฌํ„ด, ๋‹ตYES)

2) visited[y][x][๋ฐฉํ–ฅ][๋ฉ”๋ชจ๋ฆฌ๊ฐ’] ์„ ์žฌ๋ฐฉ๋ฌธํ•  ๋•Œ (=> ๊ทธ๋ƒฅ ๋ฆฌํ„ด => ๊ฒฐ๊ตญ ์ƒํƒœ false, ๋‹ตNO)

 

๋‚ด๊ฐ€ ๋†“์นœ ๋ถ€๋ถ„์€

1. visited๋ฅผ 4์ฐจ์›์œผ๋กœ ํ•ด์•ผํ•œ๋‹ค.

   => visited[y][x][๋ฐฉํ–ฅ][๋ฉ”๋ชจ๋ฆฌ๊ฐ’]

2. ?๋ฅผ ๋งŒ๋‚ฌ์„ ๋•Œ 4๋ฐฉ์„ ๋ณด๊ธฐ ์œ„ํ•ด dfs๊ฐ€ ๋๋‚˜๋ฉด visited ํ˜„์žฌ์ƒํƒœ๋ฅผ false๋กœ ๋ฐ”๊ฟ”์ค˜์•ผ ํ•œ๋‹ค.

3. ์ž…๋ ฅ ๊ฐ’์— @๊ฐ€ ์—†์„ ๊ฒฝ์šฐ, ๋ฉˆ์ถ”์ง€ ๋ชปํ•œ๋‹ค.

   => ๋ฐ”๋กœ NO ์ถœ๋ ฅํ•˜๊ณ  ๋ฆฌํ„ดํ•ด์ค˜์•ผ ํ•œ๋‹ค.

 

 

DFS, BFS ์‹คํ–‰ ์‹œ๊ฐ„์€ ํฐ ์ฐจ์ด๊ฐ€ ์—†๋‹ค. 

๋‚˜์—๊ฒ ๋ณดํ†ต๋…€์„์ด ์•„๋‹ˆ์—ˆ์Œ

 

3. ์ฝ”๋“œ

BFS

๋”๋ณด๊ธฐ
package a22_11_13;

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

public class SW_1824_ํ˜์ง„์ด์˜ํ”„๋กœ๊ทธ๋žจ๊ฒ€์ฆ {

	static char[][] map;
	static int R,C;
	static boolean isStop;
	static boolean[][][][] visited;
	
	static int[] dy = {-1,1,0,0};
	static int[] dx = {0,0,-1,1};
	
	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = null;
		
		int T = Integer.parseInt(br.readLine());
		for (int tc=1; tc<=T; tc++) {
			st = new StringTokenizer(br.readLine());
			R = Integer.parseInt(st.nextToken());
			C = Integer.parseInt(st.nextToken());
			map = new char[R][C];
			visited = new boolean[R][C][4][16];
			
			for (int i=0; i<R; i++) {
				String s = br.readLine();
				for (int j=0; j<C; j++) {
					map[i][j] = s.charAt(j);
				}
			} //์ž…๋ ฅ ๋
			
			isStop=false;
			bfs();
			if (isStop==false) System.out.println("#"+tc+" "+"NO");
			else System.out.println("#"+tc+" "+"YES");
		}
	}
	
	static void bfs() {
		Queue<Pos> queue = new ArrayDeque<> ();
		if (map[0][0] >= '0' && map[0][0] <= '9') {
			queue.offer(new Pos(0,0,3,map[0][0]-'0'));
		}
		else queue.offer(new Pos(0,0,3,0));
		
		while (!queue.isEmpty()) {
			Pos cur = queue.poll();
			int y = cur.y;
			int x = cur.x;
			int d = cur.d;
			int mem = cur.mem;
			if (map[y][x]=='@') {
				isStop = true;
				return;
			}

			if (map[y][x] >= '0' && map[y][x] <= '9') {
				mem = map[y][x]-'0';
			}
			
			if (visited[y][x][d][mem] == true) continue; //return์œผ๋กœ ๋‹ค๋ฅธ ๋ฐฉํ–ฅ์€ ๋ชป๋ณด๊ณ  ๋ฐ”๋กœ๋๋‚ด๋ฒ„๋ ค์„œ ํ‹€๋ฆผ
			visited[y][x][d][mem] = true;
			
			if (map[y][x]=='?') {
				for (int rand=0; rand<4; rand++) {
					int ny = y+dy[rand];
					int nx = x+dx[rand];
					if (ny<0) ny=R-1;
					else if (ny>=R) ny=0;
					else if (nx<0) nx=C-1;
					else if (nx>=C) nx=0;
					queue.offer(new Pos(ny, nx, rand, mem));
				}
			}
			else {
				
				if (map[y][x]=='^') d=0;
				else if (map[y][x]=='v') d=1;
				else if (map[y][x]=='<') d=2;
				else if (map[y][x]=='>') d=3;

				else if (map[y][x]=='_') {
					if (mem==0) d=3;
					else d=2;
				}
				else if (map[y][x]=='|') {
					if (mem==0) d=1;
					else d=0;
				}
				else if (map[y][x]=='@') {
					isStop = true;
					return;
				}
				else if (map[y][x]=='+') {
					if (mem==15) mem=0;
					else mem++;
				}
				else if (map[y][x]=='-') {
					if (mem==0) mem=15;
					else mem--;
				}
				
				int ny = y+dy[d];
				int nx = x+dx[d];
				if (ny<0) ny=R-1;
				else if (ny>=R) ny=0;
				else if (nx<0) nx=C-1;
				else if (nx>=C) nx=0;
				queue.offer(new Pos(ny, nx, d, mem));
			}
		}
	}

	static class Pos {
		int y, x, d, mem; //?๋ฐฉํ–ฅ๋งˆ๋‹ค mem๊ฐ’์ด ๋ฐ”๋€” ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ „์—ญ์œผ๋กœ ํ•˜๋ฉด ์•ˆ๋˜๊ณ  ๋“ค๊ณ ๋‹ค๋…€์•ผ ํ•จ
		Pos(int y, int x, int d, int mem) {
			this.y = y;
			this.x = x;
			this.d = d;
			this.mem = mem;
		}
	}
}

DFS

๋”๋ณด๊ธฐ
import java.io.*;
import java.util.*;

public class SW_1824_ํ˜์ง„์ด์˜ํ”„๋กœ๊ทธ๋žจ๊ฒ€์ฆ {

	static int R,C;
	static char[][] map;
	static boolean isStop;
	static boolean[][][][] visited;
	
	static int[] dy = {-1,1,0,0};
	static int[] dx = {0,0,-1,1};
	
	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = null;
		int T = Integer.parseInt(br.readLine());
		for (int tc=1; tc<=T; tc++) {
			st = new StringTokenizer(br.readLine());
			R = Integer.parseInt(st.nextToken());
			C = Integer.parseInt(st.nextToken());
			map = new char[R][C];
			visited = new boolean[R][C][4][16];
			
			boolean isOk = false;
			for (int i=0; i<R; i++) {
				String s = br.readLine();
				for (int j=0; j<C; j++) {
					map[i][j] = s.charAt(j);
					if (map[i][j] == '@') isOk = true;
				}
			} //์ž…๋ ฅ ๋
			
			if (isOk == false) {
				System.out.println("#"+tc+" NO");
				continue;
			}
			
			isStop = false;
			System.out.print("#"+tc+" ");
			if (map[0][0]>='0' && map[0][0]<='9') {
				dfs(0,0,3, map[0][0]-'0');
			}
			else {
				dfs(0,0,3,0);
			}
			if (isStop) System.out.println("YES");
			else System.out.println("NO");
		}
	}
	
	static void dfs(int y, int x, int d, int mem) {
		if (map[y][x] == '@') {
			isStop = true;
			if (isStop) return;
		}
		
		if (visited[y][x][d][mem] == true) return;
		visited[y][x][d][mem] = true;
		
		if (map[y][x] == '?') {
			for (int rand=0; rand<4; rand++) {
				int ny = y+dy[rand];
				int nx = x+dx[rand];
				if (ny<0) ny = R-1;
				else if (ny>=R) ny=0;
				else if (nx<0) nx=C-1;
				else if (nx>=C) nx=0;
				if (visited[ny][nx][rand][mem] == true) continue;
				
				dfs(ny, nx, rand, mem);
				visited[y][x][d][mem] = false;
				if (isStop) return;
			}
		} else {
			if (map[y][x] == '^') d=0;
			else if (map[y][x] == 'v') d=1;
			else if (map[y][x] == '<') d=2;
			else if (map[y][x] == '>') d=3;
			else if (map[y][x] == '_') {
				if (mem == 0) d=3;
				else d=2;
			}
			else if (map[y][x] == '|') {
				if (mem == 0) d=1;
				else d=0;
			}
			else if (map[y][x]>='0' && map[y][x]<='9') {
				mem = map[y][x]-'0';
			}
			else if (map[y][x] == '+') {
				if (mem==15) mem=0;
				else mem++;
			}
			else if (map[y][x] == '-') {
				if (mem==0) mem=15;
				else mem--;
			}
			int ny = y+dy[d];
			int nx = x+dx[d];
			if (ny<0) ny = R-1;
			else if (ny>=R) ny=0;
			else if (nx<0) nx=C-1;
			else if (nx>=C) nx=0;

			dfs(ny, nx, d, mem);
			if (isStop) return;
			
		}
	}
}

4. ์‚ฌ๋‹ด

๊ฑฐ์˜ 4์‹œ๊ฐ„์„ ์“ด ๊ฒƒ ๊ฐ™์€๋ฐ ๊ฒฐ๊ตญ ์นœ๊ตฌ์˜ ๋„์›€์„ ๋ฐ›์•˜๋‹ค

ํ‹€๋ฆฐ ์ด์œ ๋ฅผ ๋ฐœ๊ฒฌํ•˜๋Š” ๊ฒƒ๋„ ํ•œ์ฐธ ๊ฑธ๋ฆฌ๊ณ  ํ…Œ์ŠคํŠธ์ผ€์ด์Šค๋ฅผ ๋ถ„์„ํ•˜๋Š” ํž˜์ด ์ •๋ง ์ •๋ง ๋ถ€์กฑํ•œ ๊ฒƒ ๊ฐ™๋‹ค

๋‚˜๋„ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ž˜ํ’€๊ณ ์‹ถ๋‹ค..

์ž๊ณ  ์ผ์–ด๋‚˜์„œ DFS๋กœ ๋‹ค์‹œํ’€์–ด๋ณด์ž

 

์ดํ‹€์ด ์ง€๋‚˜์„œ DFS๋กœ ํ’€์–ด๋ณด์•˜๋‹ค.

๋ฌธ์ œ ํ’€์ด๋ฅผ ๊นŒ๋จน์—ˆ๋‹ค๊ฐ€ ๋‹ค์‹œ ํ’€์–ด๋ณด๋‹ˆ๊นŒ ํ’€๋ฆฐ๋‹ค. ์ด ๋ฌธ์ œ ์ฒ˜์Œ๋ดค์„ ๋• DFS๋กœ ์ ‘๊ทผํ–ˆ๋‹ค๊ฐ€ ์‹œ๊ฐ„์ดˆ๊ณผ๋กœ ํ„ฐ์ง€๊ธธ๋ž˜ BFS๋กœ ๋ฐ”๊ฟจ์—ˆ๋‹ค. ๊ทธ๋ž˜์„œ DFS ํ’€์ด์— ๋Œ€ํ•œ ์•„์‰ฌ์›€์ด ์žˆ์—ˆ๋Š”๋ฐ ๊ฒฐ๊ตญ ํ’€์–ด์„œ ์†์ด ์‹œ์›ํ•˜๋‹ค. ์ด๋ฒˆ์—” ๋ฐฉํ–ฅ์ „ํ™˜์„ ์ˆ˜ํ•™ ๋ง๊ณ  BFS๋กœ ํ’€์–ด๋ณด์ž..