๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
2๏ธโƒฃ Java/Problem Solving

[Java Algorithm] ํƒˆ์ถœ BOJ #3055

by seolhee2750 2022. 8. 31.
๋ฌธ์ œ

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

 

3055๋ฒˆ: ํƒˆ์ถœ

์‚ฌ์•…ํ•œ ์•”ํ‘์˜ ๊ตฐ์ฃผ ์ด๋ฏผํ˜์€ ๋“œ๋””์–ด ๋งˆ๋ฒ• ๊ตฌ์Šฌ์„ ์†์— ๋„ฃ์—ˆ๊ณ , ๊ทธ ๋Šฅ๋ ฅ์„ ์‹คํ—˜ํ•ด๋ณด๊ธฐ ์œ„ํ•ด ๊ทผ์ฒ˜์˜ ํ‹ฐ๋–ฑ์ˆฒ์— ํ™์ˆ˜๋ฅผ ์ผ์œผํ‚ค๋ ค๊ณ  ํ•œ๋‹ค. ์ด ์ˆฒ์—๋Š” ๊ณ ์Šด๋„์น˜๊ฐ€ ํ•œ ๋งˆ๋ฆฌ ์‚ด๊ณ  ์žˆ๋‹ค. ๊ณ ์Šด๋„์น˜๋Š” ์ œ

www.acmicpc.net

 

๋‚ด ๋ฌธ์ œ ํ’€์ด
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.Deque;
import java.util.StringTokenizer;

public class BOJ_3055 {

	static int r, c;
	static char[][] map;
	static int[] start;
	static Deque<int[]> que = new ArrayDeque<>();
	static int[] dx = {0, 0, -1, 1};
	static int[] dy = {-1, 1, 0, 0};

	public static int bfs() {
		while(!que.isEmpty()) {
			int[] now = que.removeFirst();
			int x = now[0];
			int y = now[1];
			int check = now[2]; // ๋ฌผ์ธ์ง€ ๊ณ ์Šด๋„์น˜์ธ์ง€ ํŒ๋‹จ (๋ฌผ == 0, ๊ณ ์Šด๋„์น˜ == 1)
			int cnt = now[3];

			for(int i = 0; i < 4; i++) {
				int nx = x + dx[i];
				int ny = y + dy[i];

				if(nx < 0 || ny < 0 || nx >= r || ny >= c) continue;
				if(check == 1 && map[nx][ny] == 'D') {
					return cnt+1;
				}
				if(map[nx][ny] != '.') continue;

				if(check == 0) map[nx][ny] = '*';
				if(check == 1) map[nx][ny] = 'S';
				que.add(new int[]{nx, ny, check, cnt+1});
			}
		}
		return -1;
	}

	public static void main(String[] args) throws Exception {
		BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st;

		st = new StringTokenizer(in.readLine());
		r = Integer.parseInt(st.nextToken());
		c = Integer.parseInt(st.nextToken());
		map = new char[r][c];

		for(int i = 0; i < r; i++) {
			String str = in.readLine();
			for(int j = 0; j < c; j++) {
				map[i][j] = str.charAt(j);
				if(map[i][j] == '*') que.add(new int[]{i, j, 0, 0}); // ๋ฌผ์˜ ์œ„์น˜ ํ์— ์ถ”๊ฐ€
				else if(map[i][j] == 'S') start = new int[]{i, j, 1, 0}; // ๊ณ ์Šด๋„์น˜ ์œ„์น˜ ์ผ๋‹จ ์ €์žฅ
			}
		}
		que.add(start); // ๊ณ ์Šด๋„์น˜๋ฅผ ๋ฌผ ์ด๋™ ํ›„ ์›€์ง์ด๊ธฐ ์œ„ํ•ด ๋งˆ์ง€๋ง‰์— ์ถ”๊ฐ€

		int ans = bfs();
		System.out.println(ans == -1 ? "KAKTUS" : ans);
	}
}

๐Ÿ‘‰ BFS ๋ฌธ์ œ

  • ์ฃผ์–ด์ง€๋Š” ์ง€๋„์˜ ์ •๋ณด๋ฅผ ๋ฐ›์œผ๋ฉด์„œ, ๋ฌผ์ด๋‚˜ ๊ณ ์Šด๋„์น˜๊ฐ€ ์ž…๋ ฅ๋œ ๊ฒฝ์šฐ๋ฅผ ์กฐ๊ฑด์ฒ˜๋ฆฌํ–ˆ๋‹ค.
    ๊ณ ์Šด๋„์น˜๋Š” ๋ฌผ์ด ์ฐฐ ์˜ˆ์ •์ธ ์นธ์œผ๋กœ ์ด๋™ํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ, ๋ฌผ ๋จผ์ € ์ด๋™ ํ›„ ๊ณ ์Šด๋„์น˜๋ฅผ ์ด๋™์‹œํ‚ค๊ณ ์ž
    ๋ฌผ์ด ์ž…๋ ฅ๋œ ๊ฒฝ์šฐ ๋ฐ”๋กœ que์— ์ถ”๊ฐ€ํ•ด์ฃผ์—ˆ๊ณ , ๊ณ ์Šด๋„์น˜๋Š” start ๋ณ€์ˆ˜์— ์ €์žฅ ํ›„ ๋งˆ์ง€๋ง‰์— ์ถ”๊ฐ€ํ–ˆ๋‹ค.
    ์ด ๋•Œ, ๋ฌผ์˜ ๊ฒฝ์šฐ que์— ์ถ”๊ฐ€ํ•˜๋Š” int ๋ฐฐ์—ด์˜ ์„ธ ๋ฒˆ์งธ ์š”์†Œ๋ฅผ 0์œผ๋กœ, ๊ณ ์Šด๋„์น˜๋Š” 1๋กœ ๋งŒ๋“ค์–ด์„œ ์ถ”๊ฐ€ํ–ˆ๋‹ค.
  • bfs ๋ฉ”์„œ๋“œ์—์„œ๋Š” ์ฒซ ๋ฒˆ์งธ ์š”์†Œ๋ถ€ํ„ฐ ๊บผ๋‚ด์–ด ํƒ์ƒ‰ํ–ˆ๋Š”๋ฐ,
    ๊ณ ์Šด๋„์น˜์ด๋ฉด์„œ, ์•ž์œผ๋กœ ํƒ์ƒ‰ํ•˜๋ ค๋Š” ์ž๋ฆฌ๊ฐ€ 'D'์ผ ๊ฒฝ์šฐ ํƒˆ์ถœ์— ์„ฑ๊ณตํ•œ ๊ฒƒ์œผ๋กœ ํŒ๋‹จํ•ด์ฃผ์—ˆ๋‹ค.
    ๊ทธ๋ฆฌ๊ณ  ์•ž์œผ๋กœ ํƒ์ƒ‰ํ•˜๋ ค๋Š” ์ž๋ฆฌ๊ฐ€ '.'์ด ์•„๋‹ˆ๋ผ๋ฉด ๊ทธ ์ž๋ฆฌ๋กœ๋Š” ๊ฐˆ ์ˆ˜ ์—†์œผ๋ฏ€๋กœ continue ํ–ˆ๋‹ค.
  • ๋ฐœ์ƒ ๊ฐ€๋Šฅํ•œ ์˜ˆ์™ธ๋ฅผ ๋ชจ๋‘ ํŒจ์Šคํ–ˆ๋‹ค๋ฉด ์•ž์œผ๋กœ ํƒ์ƒ‰ํ•˜๋ ค๋Š” ์ž๋ฆฌ์— ๋ฌผ, ํ˜น์€ ๊ณ ์Šด๋„์น˜๋ฅผ ํ™•์‚ฐ์‹œ์ผœ์ฃผ์—ˆ๋‹ค.
    ๊ทธ๋ฆฌ๊ณ  que์— ํ•ด๋‹นํ•˜๋Š” ์ž๋ฆฌ๋ฅผ ์ƒˆ๋กœ์šด ์‹œ์ž‘์ ์œผ๋กœ ์ถ”๊ฐ€ํ–ˆ๋‹ค.

 

๐Ÿ’ก ํ”ผ๋“œ๋ฐฑ

๋Œ“๊ธ€