Algorithm

[Algorithm] ๋ฑ€๊ณผ ์‚ฌ๋‹ค๋ฆฌ ๊ฒŒ์ž„(๋ฐฑ์ค€ - 16928)

ghkdu2 2023. 4. 30. 15:45

๐Ÿ“‹ ๋ฌธ์ œ

๋ฑ€๊ณผ ์‚ฌ๋‹ค๋ฆฌ ๊ฒŒ์ž„์„ ์ฆ๊ฒจ ํ•˜๋Š” ํ๋ธŒ๋Ÿฌ๋ฒ„๋Š” ์–ด๋А ๋‚  ๊ถ๊ธˆํ•œ ์ ์ด ์ƒ๊ฒผ๋‹ค.

์ฃผ์‚ฌ์œ„๋ฅผ ์กฐ์ž‘ํ•ด ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ์ˆ˜๊ฐ€ ๋‚˜์˜ค๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค๋ฉด, ์ตœ์†Œ ๋ช‡ ๋ฒˆ๋งŒ์— ๋„์ฐฉ์ ์— ๋„์ฐฉํ•  ์ˆ˜ ์žˆ์„๊นŒ?

๊ฒŒ์ž„์€ ์ •์œก๋ฉด์ฒด ์ฃผ์‚ฌ์œ„๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ, ์ฃผ์‚ฌ์œ„์˜ ๊ฐ ๋ฉด์—๋Š” 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);