๐Ÿ”ข Algorithm

[Javascript][Programmers] ๋ฐฉ๋ฌธ ๊ธธ์ด

์œค๋„๊ธฐ 2024. 7. 30. 12:54
๋ฐ˜์‘ํ˜•

 

๋ฌธ์ œ

  • ํ‚ค์›Œ๋“œ: ์ค‘๋ณต ์ฒ˜๋ฆฌ, ์—ญ๋ฐฉํ–ฅ

 

๋‚˜์˜ ํ’€์ด

  • ์‹œ๊ฐ„ ๋ณต์žก๋„: O(N)
function solution(dirs) {
    // โžŠ ์ค‘๋ณต ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ Set
    const visited = new Set();
    let x = 0, y = 0;

    // โž‹ ๋ฐฉํ–ฅ์— ๋”ฐ๋ฅธ ์ขŒํ‘œ ๋ณ€ํ™”
    const moves = {
        'U': [0, 1],
        'D': [0, -1],
        'R': [1, 0],
        'L': [-1, 0]
    };

    for (const dir of dirs) {
        const [dx, dy] = moves[dir];
        const nx = x + dx;
        const ny = y + dy;

        // โžŒ ์ฃผ์–ด์ง„ ๋ฒ”์œ„ ๋‚ด์ธ์ง€ ํ™•์ธ
        if (nx >= -5 && nx <= 5 && ny >= -5 && ny <= 5) {
            const path = JSON.stringify({from: [x, y], to: [nx, ny]});
            const reversePath = JSON.stringify({from: [nx, ny], to: [x, y]});

            // โž ์ •๋ฐฉํ–ฅ ๊ฒฝ๋กœ์™€ ์—ญ๋ฐฉํ–ฅ ๊ฒฝ๋กœ๋ฅผ ๋ชจ๋‘ ํ™•์ธ
            if (!visited.has(path) && !visited.has(reversePath)) {
                visited.add(path);
            }

            [x, y] = [nx, ny];
        }
    }

    return visited.size;
}

moves๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ ๋ฐฉํ–ฅ์— ๋Œ€ํ•œ ์ขŒํ‘œ ๋ณ€ํ™”๋ฅผ ์ •์˜ํ•˜๊ณ , Set์„ ํ™œ์šฉํ•˜์—ฌ ์ด๋ฏธ ๋ฐฉ๋ฌธํ•œ ๊ฒฝ๋กœ๋ฅผ ์ถ”์ ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ์ด๋™๋งˆ๋‹ค ํ˜„์žฌ ์œ„์น˜์—์„œ ์ƒˆ ์œ„์น˜๋กœ์˜ ๊ฒฝ๋กœ๋ฅผ ๋ฌธ์ž์—ด๋กœ ํ‘œํ˜„ํ•˜์—ฌ Set์— ์ถ”๊ฐ€ํ•˜๋Š”๋ฐ, ์ด๋•Œ ์—ญ๋ฐฉํ–ฅ ๊ฒฝ๋กœ๋„ ํ•จ๊ป˜ ์ฒดํฌํ•˜์—ฌ ์ค‘๋ณต์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์ขŒํ‘œ์˜ ๊ฒฝ๊ณ„(-5 ~ 5)๋ฅผ ๋ฒ—์–ด๋‚˜์ง€ ์•Š๋„๋ก ํ™•์ธํ•˜๋ฉฐ, ์ตœ์ข…์ ์œผ๋กœ Set์˜ ํฌ๊ธฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜์—ฌ ์œ ์ผํ•œ ๊ฒฝ๋กœ์˜ ์ˆ˜๋ฅผ ์–ป์Šต๋‹ˆ๋‹ค.

โš ๏ธ  ๋ฌธ์ž์—ด๋กœ ํ‘œํ˜„ํ•˜์—ฌ Set์— ์ถ”๊ฐ€: ๊ฐ์ฒด๋Š” ์ฐธ์กฐ ํƒ€์ž…์ด๋ฏ€๋กœ ๋‚ด์šฉ ๊ธฐ๋ฐ˜ ๋น„๊ต ์‹œ ์ง์ ‘ ์‚ฌ์šฉ์ด ๋ถˆ๊ฐ€๋Šฅ

 

๋ฌธ์ œ์ 

  • JSON.stringify() ํ˜ธ์ถœ๋กœ ์ธํ•œ ์„ฑ๋Šฅ ์ €ํ•˜
  • ํ•˜๋‚˜์˜ ํ•จ์ˆ˜์— ์ง‘์ค‘๋œ ๊ธฐ๋Šฅ๋“ค

 

๋‹ค๋ฅธ ํ’€์ด

function isValidMove(nx, ny) {
  // โžŠ ์ขŒํ‘œํ‰๋ฉด์„ ๋ฒ—์–ด๋‚˜๋Š”์ง€ ์ฒดํฌํ•˜๋Š” ํ•จ์ˆ˜
  return nx >= -5 && nx <= 5 && ny >= -5 && ny <= 5;
}

function updateLocation(x, y, dir) {
  // โž‹ ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด ๋‹ค์Œ ์ขŒํ‘œ ๊ฒฐ์ •
  switch (dir) {
    case "U":
      return [x, y + 1];
    case "D":
      return [x, y - 1];
    case "R":
      return [x + 1, y];
    case "L":
      return [x - 1, y];
  }
}

function solution(dirs) {
  let x = 0;
  let y = 0;

  const visited = new Set(); // โžŒ ๊ฒน์น˜๋Š” ์ขŒํ‘œ๋Š” 1๊ฐœ๋กœ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•จ
  for (const dir of dirs) {
    // โž ์ฃผ์–ด์ง„ ๋ช…๋ น์–ด๋กœ ์›€์ง์ด๋ฉด์„œ ์ขŒํ‘œ ์ €์žฅ
    const [nx, ny] = updateLocation(x, y, dir);

    if (!isValidMove(nx, ny)) {
      // โžŽ ๋ฒ—์–ด๋‚œ ์ขŒํ‘œ๋Š” ์ธ์ •ํ•˜์ง€ ์•Š์Œ
      continue;
    }

    // โž A์—์„œ B๋กœ ๊ฐ„ ๊ฒฝ์šฐ B์—์„œ A๋„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•จ(์ด ๊ฒฝ๋กœ์˜ ๊ฐœ์ˆ˜๋Š” ๋ฐฉํ–ฅ์„ฑ์ด ์—†์Œ)
    visited.add(`${x}${y}${nx}${ny}`);
    visited.add(`${nx}${ny}${x}${y}`);

    [x, y] = [nx, ny]; // โž ์ขŒํ‘œ๋ฅผ ์ด๋™ํ–ˆ์œผ๋ฏ€๋กœ ์—…๋ฐ์ดํŠธ
  }

  return visited.size / 2;
}
  • ๋ณ„๋„์˜ ํ™•์ธ ๊ณผ์ • ์—†์ด ์ •๋ฐฉํ–ฅ ๊ฒฝ๋กœ์™€ ์—ญ๋ฐฉํ–ฅ ๊ฒฝ๋กœ๋ฅผ ๋™์‹œ์— ์ถ”๊ฐ€ํ•˜๊ณ , ์ตœ์ข… ์ด๋™ ๊ธธ์ด๋ฅผ 2๋กœ ๋‚˜๋ˆ”

 


Reference

์ฝ”๋”ฉํ…Œ์ŠคํŠธ ํ•ฉ๊ฒฉ์ž ๋˜๊ธฐ: ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŽธ

๋ฐ˜์‘ํ˜•