๐ŸŒžAlgorithm/๐Ÿ”ฅBaekjoon

[Baekjoon] 16509_์žฅ๊ตฐ

๋ฟŒ์•ผ._. 2023. 5. 28. 00:22

Gold V

๋ฌธ์ œ(์ถœ์ฒ˜: https://www.acmicpc.net/problem/16509)

< ์žฅ๊ตฐ >

 

๋ฌธ์ œ ํ’€์ด

bfs๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์ƒํ•˜์ขŒ์šฐ๋กœ ์ด๋™ ํ›„ ๋Œ€๊ฐ์„ ์œผ๋กœ ์ด๋™ํ•  ๋•Œ ์กฐ๊ฑด์„ ์„ค์ •ํ•ด ์ค€๋‹ค.

 

1. ์žฅ๊ธฐํŒ ๋ฒ”์œ„ ์•ˆ์ธ์ง€ ํ™•์ธ

2. ๋Œ€๊ฐ์„ ์œผ๋กœ ์ด๋™ํ•˜๋Š” ๊ธธ์— ๋‹ค๋ฅธ ๊ธฐ๋ฌผ์ด ์žˆ๋Š”์ง€ ํ™•์ธ

3. ๋ฐฉ๋ฌธ ์—ฌ๋ถ€ ํ™•์ธ

4. ์™•์˜ ์œ„์น˜์ธ์ง€ ํ™•์ธ

 

์œ„์™€ ๊ฐ™์ด 4๊ฐ€์ง€์˜ ์กฐ๊ฑด์„ ์„ค์ •ํ•ด ์ฃผ๋ฉด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

 

 

 my solution (Java)

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;

public class _16509_ {
	static int dx[] = { -1, 0, 1, 0 }; // ์ƒ ์šฐ ํ•˜ ์ขŒ
	static int dy[] = { 0, 1, 0, -1 };
	static int dx2[] = { -1, -1, -1, 1, 1, 1, 1, -1 }; // ๋Œ€๊ฐ์„ 
	static int dy2[] = { -1, 1, 1, 1, 1, -1, -1, -1 };
	static int r2, c2, result;
	static boolean visited[][];

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

		visited = new boolean[10][9];
		result = -1;

		// ์ƒ์˜ ์œ„์น˜
		int r1 = Integer.parseInt(st.nextToken());
		int c1 = Integer.parseInt(st.nextToken());

		// ์™•์˜ ์œ„์น˜
		st = new StringTokenizer(bf.readLine());
		r2 = Integer.parseInt(st.nextToken());
		c2 = Integer.parseInt(st.nextToken());

		bfs(r1, c1, 0);

		System.out.println(result);

	}

	private static void bfs(int r1, int c1, int depth) {
		Queue<int[]> queue = new LinkedList<>();
		queue.add(new int[] { r1, c1, depth });
		visited[r1][c1] = true;

		while (!queue.isEmpty()) {
			int temp[] = queue.poll();
			int num = 0;
			for (int i = 0; i < 4; i++) {
				int x = temp[0] + dx[i];
				int y = temp[1] + dy[i];
				if (x >= 0 && x < 10 && y >= 0 && y < 9 ) { // ์žฅ๊ธฐํŒ ๋ฒ”์œ„ ์•ˆ
					for (int j = num; j < num+2; j++) {
						if (x + (dx2[j] * 2) >= 0 && x + (dx2[j] * 2) < 10 && y + (dy2[j] * 2) >= 0
								&& y + (dy2[j] * 2) < 9) { // ์žฅ๊ธฐํŒ ๋ฒ”์œ„ ์•ˆ
							if (x + dx2[j] == r2 && y + dy2[j] == c2) // ๋‹ค๋ฅธ ๊ธฐ๋ฌผ์ด ์žˆ์œผ๋ฉด ์ด๋™ x
								continue;
							if (visited[x + (dx2[j] * 2)][y + (dy2[j] * 2)]) 
								continue;
							if (x + (dx2[j] * 2) == r2 && y + (dy2[j] * 2) == c2) {
								result = temp[2] + 1;
								break;
							}
							visited[x + (dx2[j] * 2)][y + (dy2[j] * 2)] = true;
							queue.add(new int[] { x + (dx2[j] * 2), y + (dy2[j] * 2), temp[2] + 1 });
						}
					}
					if (result > -1)
						break;
				}
				num += 2;
			}
			if (result > -1)
				break;
		}
	}
}

 

Main

- visited : ๋ฐฉ๋ฌธ ์—ฌ๋ถ€

- result: ์ตœ์†Œ ์ด๋™ ํšŸ์ˆ˜

- ์ƒ์˜ ์œ„์น˜์™€ ์™•์˜ ์œ„์น˜ ์ž…๋ ฅ ํ›„ bfs ํ˜ธ์ถœ

 

bfs

- queue์— {x ์ขŒํ‘œ, y ์ขŒํ‘œ, ๋ฐฉ๋ฌธ ์ˆ˜} ์ €์žฅ ๋ฐ ๋ฐฉ๋ฌธ ํ‘œ์‹œ

- queue๊ฐ€ ๋นŒ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต -> ์ƒํ•˜์ขŒ์šฐ๋กœ ์ด๋™ํ•˜์—ฌ ์žฅ๊ธฐํŒ ๋ฒ”์œ„ ์•ˆ์ด๋ฉด ๋Œ€๊ฐ์„ ์œผ๋กœ ์ด๋™ -> ์žฅ๊ธฐํŒ ๋ฒ”์œ„ ์•ˆ์ธ์ง€ ํ™•์ธ -> ๋‹ค๋ฅธ ๊ธฐ๋ฌผ์ด ์žˆ์œผ๋ฉด x ๋ฐ ๋ฐฉ๋ฌธํ•œ ์ ์ด ์žˆ์œผ๋ฉด x -> ๋Œ€๊ฐ์„ ์œผ๋กœ ์ด๋™ํ•œ ์œ„์น˜๊ฐ€ ์™•์˜ ์œ„์น˜๋ผ๋ฉด ์ข…๋ฃŒ / ์™•์˜ ์œ„์น˜๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด ๋ฐฉ๋ฌธ ํ‘œ์‹œ ๋ฐ queue์— ์ €์žฅ

 


์ƒ๊ฐ๐Ÿค”

 

๋Œ€๊ฐ์„ ์œผ๋กœ ์ด๋™ํ–ˆ์„ ๋•Œ ๋ฒ”์œ„ ์กฐ๊ฑด์„ ์ž˜ ์„ค์ •ํ•ด ์ฃผ๋ฉด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.