[Algorithm] ๋ฑ๊ณผ ์ฌ๋ค๋ฆฌ ๊ฒ์(๋ฐฑ์ค - 16928)
๐ ๋ฌธ์
๋ฑ๊ณผ ์ฌ๋ค๋ฆฌ ๊ฒ์์ ์ฆ๊ฒจ ํ๋ ํ๋ธ๋ฌ๋ฒ๋ ์ด๋ ๋ ๊ถ๊ธํ ์ ์ด ์๊ฒผ๋ค.
์ฃผ์ฌ์๋ฅผ ์กฐ์ํด ๋ด๊ฐ ์ํ๋ ์๊ฐ ๋์ค๊ฒ ๋ง๋ค ์ ์๋ค๋ฉด, ์ต์ ๋ช ๋ฒ๋ง์ ๋์ฐฉ์ ์ ๋์ฐฉํ ์ ์์๊น?
๊ฒ์์ ์ ์ก๋ฉด์ฒด ์ฃผ์ฌ์๋ฅผ ์ฌ์ฉํ๋ฉฐ, ์ฃผ์ฌ์์ ๊ฐ ๋ฉด์๋ 1๋ถํฐ 6๊น์ง ์๊ฐ ํ๋์ฉ ์ ํ์๋ค. ๊ฒ์์ ํฌ๊ธฐ๊ฐ 10×10์ด๊ณ , ์ด 100๊ฐ์ ์นธ์ผ๋ก ๋๋์ด์ ธ ์๋ ๋ณด๋ํ์์ ์งํ๋๋ค. ๋ณด๋ํ์๋ 1๋ถํฐ 100๊น์ง ์๊ฐ ํ๋์ฉ ์์๋๋ก ์ ํ์ ธ ์๋ค.
ํ๋ ์ด์ด๋ ์ฃผ์ฌ์๋ฅผ ๊ตด๋ ค ๋์จ ์๋งํผ ์ด๋ํด์ผ ํ๋ค. ์๋ฅผ ๋ค์ด, ํ๋ ์ด์ด๊ฐ i๋ฒ ์นธ์ ์๊ณ , ์ฃผ์ฌ์๋ฅผ ๊ตด๋ ค ๋์จ ์๊ฐ 4๋ผ๋ฉด, i+4๋ฒ ์นธ์ผ๋ก ์ด๋ํด์ผ ํ๋ค. ๋ง์ฝ ์ฃผ์ฌ์๋ฅผ ๊ตด๋ฆฐ ๊ฒฐ๊ณผ๊ฐ 100๋ฒ ์นธ์ ๋์ด๊ฐ๋ค๋ฉด ์ด๋ํ ์ ์๋ค. ๋์ฐฉํ ์นธ์ด ์ฌ๋ค๋ฆฌ๋ฉด, ์ฌ๋ค๋ฆฌ๋ฅผ ํ๊ณ ์๋ก ์ฌ๋ผ๊ฐ๋ค. ๋ฑ์ด ์๋ ์นธ์ ๋์ฐฉํ๋ฉด, ๋ฑ์ ๋ฐ๋ผ์ ๋ด๋ ค๊ฐ๊ฒ ๋๋ค. ์ฆ, ์ฌ๋ค๋ฆฌ๋ฅผ ์ด์ฉํด ์ด๋ํ ์นธ์ ๋ฒํธ๋ ์๋ ์๋ ์นธ์ ๋ฒํธ๋ณด๋ค ํฌ๊ณ , ๋ฑ์ ์ด์ฉํด ์ด๋ํ ์นธ์ ๋ฒํธ๋ ์๋ ์๋ ์นธ์ ๋ฒํธ๋ณด๋ค ์์์ง๋ค.
๊ฒ์์ ๋ชฉํ๋ 1๋ฒ ์นธ์์ ์์ํด์ 100๋ฒ ์นธ์ ๋์ฐฉํ๋ ๊ฒ์ด๋ค.
๊ฒ์ํ์ ์ํ๊ฐ ์ฃผ์ด์ก์ ๋, 100๋ฒ ์นธ์ ๋์ฐฉํ๊ธฐ ์ํด ์ฃผ์ฌ์๋ฅผ ๊ตด๋ ค์ผ ํ๋ ํ์์ ์ต์๊ฐ์ ๊ตฌํด๋ณด์.
์ ๋ ฅ
- ์ฒซ์งธ ์ค์ ๊ฒ์ํ์ ์๋ ์ฌ๋ค๋ฆฌ์ ์ N(1 ≤ N ≤ 15)๊ณผ ๋ฑ์ ์ M(1 ≤ M ≤ 15)์ด ์ฃผ์ด์ง๋ค.
- ๋์งธ ์ค๋ถํฐ N๊ฐ์ ์ค์๋ ์ฌ๋ค๋ฆฌ์ ์ ๋ณด๋ฅผ ์๋ฏธํ๋ x, y (x < y)๊ฐ ์ฃผ์ด์ง๋ค. x๋ฒ ์นธ์ ๋์ฐฉํ๋ฉด, y๋ฒ ์นธ์ผ๋ก ์ด๋ํ๋ค๋ ์๋ฏธ์ด๋ค.
- ๋ค์ M๊ฐ์ ์ค์๋ ๋ฑ์ ์ ๋ณด๋ฅผ ์๋ฏธํ๋ u, v (u > v)๊ฐ ์ฃผ์ด์ง๋ค. u๋ฒ ์นธ์ ๋์ฐฉํ๋ฉด, v๋ฒ ์นธ์ผ๋ก ์ด๋ํ๋ค๋ ์๋ฏธ์ด๋ค.
- 1๋ฒ ์นธ๊ณผ 100๋ฒ ์นธ์ ๋ฑ๊ณผ ์ฌ๋ค๋ฆฌ์ ์์ ๋๋ ๋์ด ์๋๋ค. ๋ชจ๋ ์นธ์ ์ต๋ ํ๋์ ์ฌ๋ค๋ฆฌ ๋๋ ๋ฑ์ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ, ๋์์ ๋ ๊ฐ์ง๋ฅผ ๋ชจ๋ ๊ฐ์ง๊ณ ์๋ ๊ฒฝ์ฐ๋ ์๋ค. ํญ์ 100๋ฒ ์นธ์ ๋์ฐฉํ ์ ์๋ ์ ๋ ฅ๋ง ์ฃผ์ด์ง๋ค.
์ถ๋ ฅ
- 100๋ฒ ์นธ์ ๋์ฐฉํ๊ธฐ ์ํด ์ฃผ์ฌ์๋ฅผ ์ต์ ๋ช ๋ฒ ๊ตด๋ ค์ผ ํ๋์ง ์ถ๋ ฅํ๋ค.
์ ์ถ๋ ฅ ์์
์์ ์ ๋ ฅ | ์์ ์ถ๋ ฅ |
3 7 32 62 42 68 12 98 95 13 97 25 93 37 79 27 75 19 49 47 67 17 |
3 |
โ๏ธ ํ์ด
100์ด ๋๋ ์ต๋จ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๋ฉด ๋๋ ์ ํ์ ์ธ BFS ๋ฌธ์ ์๋ค.
์ฌ๋ค๋ฆฌ ๋๋ ๋ฑ์ ๋ง๋ฌ์ ๋๋ฅผ ๊ณ ๋ คํด์ route๋ผ๋ ๊ฐ์ฒด๋ฅผ ํ๋ ๋ง๋ค์๋ค. ์ฌ๋ค๋ฆฌ ๋ฐ ๋ฑ์ ํฉ์ณ๋ 30๊ฐ๋ฅผ ๋์ง ์๊ธฐ ๋๋ฌธ์ Map์ ์ฌ์ฉํ์ง ์๊ณ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ค. start, end๋ก ๊ตฌ๋ถํด์ ํ์ฌ ์์น์์ ์ด๋ํ ์ ์๋ ์์น๋ฅผ ์ ์ฅํ๋ค.
BFS ํจ์๋ฅผ ๋ฐ๋ก ์์ฑํ๋๋ฐ ์ด BFS๋ ๋ฐฐ์ด์ ์ฌ์ฉํด์ shift()ํ๋ ๋ฐฉ์์ผ๋ก ๊ตฌํํ๋ค. ๋ฐฉ๋ฌธํ๋ ์์น๋ ์ต์ ํ์๋ฅผ ๊ตฌํ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๋ค์ ๊ฐ ์ด์ ๊ฐ ์์ด check๋ฐฐ์ด์ 100๊ธธ์ด๋ก 0์ผ๋ก ์ด๊ธฐํํ๋ค. ๋ง์ฝ queue์ ๋ค์ด๊ฐ๋ค๋ฉด check[ํด๋น์์น]๋ฅผ 1๋ก ์ฒดํฌํ๊ณ while๋ฌธ์ผ๋ก ํ์ํ ๋ check = 1์ด๋ฉด continue ์์ผฐ๋ค. ์ฃผ์ฌ์๋ฅผ ๊ตด๋ฆฌ๋ ๊ฒฝ์ฐ๋ฅผ ์๊ฐํด์ 1~6๊น์ง๋ฅผ ๋ฐ๋ณต๋ฌธ์ผ๋ก ํ์ธํ๊ณ ๋ฑ ๋๋ ์ฌ๋ค๋ฆฌ๋ฅผ ๋ง๋๋ ๊ฒฝ์ฐ๋ฅผ ์๊ฐํด์ route๊ฐ์ฒด์ ํค๊ฐ์ผ๋ก ํด๋น ์์น๊ฐ ์กด์ฌํ๋ฉด ์ฌ๋ค๋ฆฌ ๋๋ ๋ฑ์ ํ๊ณ ์ด๋๋ ์์น๋ก ๊ณ์ฐํ๋ค. 100์ ๋๊ธฐ๋ ๊ฒฝ์ฐ๋ก ์ด๋ํ ์ ์๊ธฐ ๋๋ฌธ์ 100 ์ด์์ด ๋๋ฉด continue ์ํค๊ณ 100์ธ ๊ฒฝ์ฐ์ cnt๋ฅผ ์ฆ๊ฐ์ํค๋ฉฐ ๋ฐํํจ์ผ๋ก์ BFS ํจ์๋ฅผ ์ข ๋ฃํ๋ค.
๋ง์ง๋ง์ผ๋ก ๋ฐํ๋ ๊ฐ์ ์ถ๋ ฅํ๋ฉฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ค.
โจ๏ธ ์ฝ๋
const fs = require('fs');
const filePath = process.platform === 'linux' ? '/dev/stdin' : './testcase/16928.txt';
let input = fs.readFileSync(filePath).toString().trim().split('\n');
const routeArr = input.slice(1).map(item => item.split(' ').map(Number));
const route = {};
for (const r of routeArr) {
const [start, end] = r;
route[start] = end;
}
const bfs = () => {
const queue = [1];
const check = new Array(100).fill(0);
check[1] = 1;
let cnt = 0;
while (queue.length) {
const len = queue.length;
for (let i = 0; i < len; i++) {
const pos = queue.shift();
for (let k = 1; k <= 6; k++) {
const nextPos = route[pos + k] ? route[pos + k] : pos + k;
if (nextPos === 100) return cnt + 1;
if (nextPos > 100) continue;
if (check[nextPos]) continue;
check[nextPos] = 1;
queue.push(nextPos);
}
}
cnt += 1;
}
};
const answer = bfs();
console.log(answer);