HyeLog

๋ฐฑ์ค€_16928_๋ฑ€๊ณผ ์‚ฌ๋‹ค๋ฆฌ ๊ฒŒ์ž„ ๋ณธ๋ฌธ

์•Œ๊ณ ๋ฆฌ์ฆ˜

๋ฐฑ์ค€_16928_๋ฑ€๊ณผ ์‚ฌ๋‹ค๋ฆฌ ๊ฒŒ์ž„

shj718 2022. 6. 16. 00:34

๐Ÿ™‹‍โ™€๏ธ ๋ฌธ์ œ

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

 

16928๋ฒˆ: ๋ฑ€๊ณผ ์‚ฌ๋‹ค๋ฆฌ ๊ฒŒ์ž„

์ฒซ์งธ ์ค„์— ๊ฒŒ์ž„ํŒ์— ์žˆ๋Š” ์‚ฌ๋‹ค๋ฆฌ์˜ ์ˆ˜ N(1 ≤ N ≤ 15)๊ณผ ๋ฑ€์˜ ์ˆ˜ M(1 ≤ M ≤ 15)์ด ์ฃผ์–ด์ง„๋‹ค. ๋‘˜์งธ ์ค„๋ถ€ํ„ฐ N๊ฐœ์˜ ์ค„์—๋Š” ์‚ฌ๋‹ค๋ฆฌ์˜ ์ •๋ณด๋ฅผ ์˜๋ฏธํ•˜๋Š” x, y (x < y)๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. x๋ฒˆ ์นธ์— ๋„์ฐฉํ•˜๋ฉด, y๋ฒˆ ์นธ์œผ

www.acmicpc.net

 

๐Ÿงฉ ์•Œ๊ณ ๋ฆฌ์ฆ˜

๋ฌธ์ œ์˜ ๋ชฉ์ : ๋ชจ๋“  ์ •์  ๋ฐฉ๋ฌธ, ์ตœ๋‹จ๊ฑฐ๋ฆฌ ๊ตฌํ•˜๊ธฐ → BFS ์•Œ๊ณ ๋ฆฌ์ฆ˜

Tip) ๊ทธ๋ž˜ํ”„๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๊ณ  ๋ชจ๋“  ๊ฐ€์ค‘์น˜๊ฐ€ 1์ธ ๋ฌธ์ œ  BFS ์•Œ๊ณ ๋ฆฌ์ฆ˜

BFS ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ํ•ต์‹ฌ์€ ํ์— ์ •์ ์„ ๋„ฃ์„ ๋•Œ ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

 

๐Ÿ’ก ์•„์ด๋””์–ด

arr ๋ฐฐ์—ด์— 2์ฐจ๋กœ ์ด๋™ํ•  ์นธ์„ ์ €์žฅํ•œ๋‹ค. ์—ฌ๊ธฐ์„œ '2์ฐจ'์˜ ์˜๋ฏธ๋ฅผ ์„ค๋ช…ํ•˜์ž๋ฉด, 1์ฐจ ์ด๋™์ด ์ฃผ์‚ฌ์œ„์˜ ์ˆซ์ž๋งŒํผ ์ด๋™ํ•˜๋Š” ๊ฒƒ์ด๋ผ๋ฉด 2์ฐจ ์ด๋™์€ ์‚ฌ๋‹ค๋ฆฌ / ๋ฑ€์ด ์žˆ์„ ๊ฒฝ์šฐ ๋˜ ํ•œ๋ฒˆ ์ด๋™ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. ๋”ฐ๋ผ์„œ, arr[x] = y ์˜ ์˜๋ฏธ๋Š” x์นธ์— ์™”์„ ๋•Œ 2์ฐจ๋กœ ์ด๋™ํ•  ์นธ์ด y๋ผ๋Š” ๊ฒƒ์ด๋‹ค. ๋งŒ์•ฝ ์‚ฌ๋‹ค๋ฆฌ / ๋ฑ€์ด ์—†๋Š” ์ผ๋ฐ˜์นธ์ด๋ผ๋ฉด, 2์ฐจ ์ด๋™์ด ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ(=๊ทธ๋ƒฅ ํ•ด๋‹น ์นธ์— ๋จธ๋ฌผ๋Ÿฌ ์žˆ๋Š” ๊ฒƒ์ด๋ฏ€๋กœ) ์ธ๋ฑ์Šค ๊ฐ’์„ ์ €์žฅํ•œ๋‹ค.

 

dist ๋ฐฐ์—ด์—๋Š” n๋ฒˆ์งธ ์นธ์— ๋„์ฐฉํ•˜๋Š” ์ตœ์†Œ ์ฃผ์‚ฌ์œ„ ๋˜์ง ํšŸ์ˆ˜๋ฅผ ์ €์žฅํ•œ๋‹ค. ๋˜ํ•œ, ์ด ๋ฐฐ์—ด์„ BFS์˜ ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ์— ํ™œ์šฉํ•œ๋‹ค. (-1์ด๋ฉด ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์นธ์„ ์˜๋ฏธ)

 

๐Ÿ‘ฉ‍๐Ÿ’ป ์ฝ”๋“œ

#include <iostream>
#include <queue>

using namespace std;

int arr[101];
int dist[101];

void bfs() {
	dist[1] = 0; // 1๋ฒˆ์งธ ์นธ์— ๋„์ฐฉํ•˜๋Š” ์ตœ์†Œ ์ฃผ์‚ฌ์œ„ ๋˜์ง ํšŸ์ˆ˜๋Š” 0
	queue<int> q;
	q.push(1);
	while (!q.empty()) {
		int x = q.front(); q.pop();
		for (int i = 1; i <= 6; i++) {
			int y = x + i;
			if (y > 100) continue;
			y = arr[y];
			if (dist[y] == -1) {
				dist[y] = dist[x] + 1;
				q.push(y);
			}
		}
	}
}

int main() {
	ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
	int n, m;
	cin >> n >> m;
	for (int i = 1; i <= 100; i++) {
		arr[i] = i;
		dist[i] = -1;
	}
	int a, b;
	for (int i = 0; i < n; i++) { // ์‚ฌ๋‹ค๋ฆฌ
		cin >> a >> b;
		arr[a] = b;
	}
	for (int i = 0; i < m; i++) { // ๋ฑ€
		cin >> a >> b;
		arr[a] = b;
	}
	bfs();
	cout << dist[100] << '\n';
	return 0;
}