๊ด€๋ฆฌ ๋ฉ”๋‰ด

Ming's develop story

๊ณต์› ์‚ฐ์ฑ… - ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ๋ณธ๋ฌธ

D E V E L O P ๐Ÿ’ป/์•Œ๊ณ ๋ฆฌ์ฆ˜

๊ณต์› ์‚ฐ์ฑ… - ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

Ming 2025. 2. 12. 19:09
๋ฌธ์ œ ์„ค๋ช…
์ง€๋‚˜๋‹ค๋‹ˆ๋Š” ๊ธธ์„ 'O', ์žฅ์• ๋ฌผ์„ 'X'๋กœ ๋‚˜ํƒ€๋‚ธ ์ง์‚ฌ๊ฐํ˜• ๊ฒฉ์ž ๋ชจ์–‘์˜ ๊ณต์›์—์„œ ๋กœ๋ด‡ ๊ฐ•์•„์ง€๊ฐ€ ์‚ฐ์ฑ…์„ ํ•˜๋ คํ•ฉ๋‹ˆ๋‹ค. ์‚ฐ์ฑ…์€ ๋กœ๋ด‡ ๊ฐ•์•„์ง€์— ๋ฏธ๋ฆฌ ์ž…๋ ฅ๋œ ๋ช…๋ น์— ๋”ฐ๋ผ ์ง„ํ–‰ํ•˜๋ฉฐ, ๋ช…๋ น์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ˜•์‹์œผ๋กœ ์ฃผ์–ด์ง‘๋‹ˆ๋‹ค.
["๋ฐฉํ–ฅ ๊ฑฐ๋ฆฌ", "๋ฐฉํ–ฅ ๊ฑฐ๋ฆฌ" … ]
์˜ˆ๋ฅผ ๋“ค์–ด "E 5"๋Š” ๋กœ๋ด‡ ๊ฐ•์•„์ง€๊ฐ€ ํ˜„์žฌ ์œ„์น˜์—์„œ ๋™์ชฝ์œผ๋กœ 5์นธ ์ด๋™ํ–ˆ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค. ๋กœ๋ด‡ ๊ฐ•์•„์ง€๋Š” ๋ช…๋ น์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์ „์— ๋‹ค์Œ ๋‘ ๊ฐ€์ง€๋ฅผ ๋จผ์ € ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
์ฃผ์–ด์ง„ ๋ฐฉํ–ฅ์œผ๋กœ ์ด๋™ํ•  ๋•Œ ๊ณต์›์„ ๋ฒ—์–ด๋‚˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.์ฃผ์–ด์ง„ ๋ฐฉํ–ฅ์œผ๋กœ ์ด๋™ ์ค‘ ์žฅ์• ๋ฌผ์„ ๋งŒ๋‚˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
์œ„ ๋‘ ๊ฐ€์ง€์ค‘ ์–ด๋Š ํ•˜๋‚˜๋ผ๋„ ํ•ด๋‹น๋œ๋‹ค๋ฉด, ๋กœ๋ด‡ ๊ฐ•์•„์ง€๋Š” ํ•ด๋‹น ๋ช…๋ น์„ ๋ฌด์‹œํ•˜๊ณ  ๋‹ค์Œ ๋ช…๋ น์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.๊ณต์›์˜ ๊ฐ€๋กœ ๊ธธ์ด๊ฐ€ W, ์„ธ๋กœ ๊ธธ์ด๊ฐ€ H๋ผ๊ณ  ํ•  ๋•Œ, ๊ณต์›์˜ ์ขŒ์ธก ์ƒ๋‹จ์˜ ์ขŒํ‘œ๋Š” (0, 0), ์šฐ์ธก ํ•˜๋‹จ์˜ ์ขŒํ‘œ๋Š” (H - 1, W - 1) ์ž…๋‹ˆ๋‹ค.
๊ณต์›์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฌธ์ž์—ด ๋ฐฐ์—ด park, ๋กœ๋ด‡ ๊ฐ•์•„์ง€๊ฐ€ ์ˆ˜ํ–‰ํ•  ๋ช…๋ น์ด ๋‹ด๊ธด ๋ฌธ์ž์—ด ๋ฐฐ์—ด routes๊ฐ€ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ฃผ์–ด์งˆ ๋•Œ, ๋กœ๋ด‡ ๊ฐ•์•„์ง€๊ฐ€ ๋ชจ๋“  ๋ช…๋ น์„ ์ˆ˜ํ–‰ ํ›„ ๋†“์ธ ์œ„์น˜๋ฅผ [์„ธ๋กœ ๋ฐฉํ–ฅ ์ขŒํ‘œ, ๊ฐ€๋กœ ๋ฐฉํ–ฅ ์ขŒํ‘œ] ์ˆœ์œผ๋กœ ๋ฐฐ์—ด์— ๋‹ด์•„ return ํ•˜๋„๋ก solution ํ•จ์ˆ˜๋ฅผ ์™„์„ฑํ•ด์ฃผ์„ธ์š”.

๊ณต์›์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฌธ์ž์—ด ๋ฐฐ์—ด 
park, ๋กœ๋ด‡ ๊ฐ•์•„์ง€๊ฐ€ ์ˆ˜ํ–‰ํ•  ๋ช…๋ น์ด ๋‹ด๊ธด ๋ฌธ์ž์—ด ๋ฐฐ์—ด routes๊ฐ€ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ฃผ์–ด์งˆ ๋•Œ, ๋กœ๋ด‡ ๊ฐ•์•„์ง€๊ฐ€ ๋ชจ๋“  ๋ช…๋ น์„ ์ˆ˜ํ–‰ ํ›„ ๋†“์ธ ์œ„์น˜๋ฅผ [์„ธ๋กœ ๋ฐฉํ–ฅ ์ขŒํ‘œ, ๊ฐ€๋กœ ๋ฐฉํ–ฅ ์ขŒํ‘œ] ์ˆœ์œผ๋กœ ๋ฐฐ์—ด์— ๋‹ด์•„ return ํ•˜๋„๋ก solution ํ•จ์ˆ˜๋ฅผ ์™„์„ฑํ•ด์ฃผ์„ธ์š”.



ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค/๊ณต์› ์‚ฐ์ฑ…

 

์ž…์ถœ๋ ฅ ์˜ˆ

park routes result
["SOO","OOO","OOO"] ["E 2","S 2","W 1"] [2,1]

 

๋‚ด ํ’€์ด

function computeRobotPosition(park, routes) {
  let robotPosition = [];
  const obstacle = new Set();

  for (let i = 0; i < park.length; i++) {
    for (let j = 0; j < park[i].length; j++) {
      if (park[i][j] === "X") {
        obstacle.add(`${i},${j}`);
      }
      if (park[i][j] === "S") {
        const startPoint = [i, j];
        robotPosition = startPoint;
      }
    }
  }

  const directions = {
    E: [0, 1],
    W: [0, -1],
    S: [1, 0],
    N: [-1, 0],
  };

  const canMove = (direction, distance) => {
    let [y, x] = robotPosition;
    const [dy, dx] = directions[direction];

    for (let i = 1; i <= distance; i++) {
      y += dy;
      x += dx;

      const isOverTheOutline =
        y < 0 || y >= park.length || x < 0 || x >= park[0].length;
      if (isOverTheOutline) {
        return false;
      }

      const hasObstacleOnTheRoute = obstacle.has(`${y},${x}`);
      if (hasObstacleOnTheRoute) {
        return false;
      }
    }

    return true;
  };

  for (const route of routes) {
    const [direction, distance] = route.split(" ");
    const dist = parseInt(distance);

    if (canMove(direction, dist)) {
      const [dy, dx] = directions[direction];
      robotPosition = [
        robotPosition[0] + dy * dist,
        robotPosition[1] + dx * dist,
      ];
    }
  }

  return robotPosition;
}

 

์šฐ์„  ๋“ค์—ˆ๋˜ ์ƒ๊ฐ์€ ์‹œ์ž‘ ์ง€์ ๊ณผ ์žฅ์• ๋ฌผ ์œ„์น˜ ์ขŒํ‘œ๊ฐ€ ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๊ณ  ๊ทธ๊ฑธ ์œ„ํ•ด์„œ park๋ฅผ ์ˆœํšŒํ•˜์˜€๊ณ , ์–ด์งœํ”ผ ์žฅ์• ๋ฌผ ์œ„์น˜๊ฐ€ ์–ด๋””์ผ์ง€ ๋ชจ๋ฅด๋‹ˆ park ์ „์ฒด๋ฅผ ์ˆœํšŒํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์—ฌ ๊ฐ™์€ ๋ฐ˜๋ณต๋ฌธ์— ์œ„์น˜ํ•˜๊ฒŒ ํ–ˆ๋‹ค.

 

๊ทธ๋ฆฌ๊ณ  ์ฒ˜์Œ์— ์ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ตฌํ˜„ํ•˜๋˜ ๋ฐฉ๋ฒ•์€ ํ•œ ์นธ์”ฉ ์ด๋™ํ•˜๋ฉฐ(canMove์—์„œ ๋ฐ˜๋ณต๋ฌธ์œผ๋กœ) ์žฅ์• ๋ฌผ์ด๋‚˜ ๊ฒฝ๊ณ„๋ฅผ ๋„˜์–ด๊ฐ€๋Š”์ง€ ์ฒดํฌํ•˜๋Š” ๋ฐฉ์‹์ด ์•„๋‹ˆ์—ˆ๊ณ , routes ์—์„œ ํ•˜๋‚˜์˜ ์š”์†Œ๋ณ„๋กœ ์ด๋™์„ ์‹œํ‚ค๋ฉด์„œ ๊ทธ ๊ฒฐ๊ณผ๊ฐ’์ด ๊ฒฝ๊ณ„๋ฅผ ์ง€๋‚˜์™”๋Š”์ง€, ๊ฒฝ๊ณ„๋ฅผ ๋„˜์—ˆ๋Š”์ง€๋ฅผ ์ฒดํฌํ–ˆ๋Š”๋ฐ ๋กœ์ง์ด ์ ์  ๋” ๋ณต์žกํ•ด์กŒ๊ณ  ๋ญ”๊ฐ€ ์ž˜๋ชป๋จ์„ ๋Š๊ผˆ๋‹ค.

 

๋‹ค์‹œ ์ฒ˜์Œ๋ถ€ํ„ฐ ์ ‘๊ทผํ•œ๋‹ค๋Š” ์ƒ๊ฐ์œผ๋กœ directions๋ฅผ ์ง€์ •ํ–ˆ๊ณ  routes๋ฅผ ์ˆœํšŒํ•˜๋ฉฐ ์กฐ๊ฑด(์žฅ์• ๋ฌผ๊ณผ ๊ฒฝ๊ณ„)๋งŒ ํ†ต๊ณผํ•˜๋ฉด ์ด๋™์‹œํ‚ค๋Š” ๋กœ์ง์„ ๋งŒ๋“ค๊ธฐ๋กœ ํ–ˆ๋‹ค. 

๊ทธ๋ ‡๊ฒŒํ•ด์„œ canMove ํ•จ์ˆ˜ ๋‚ด์—์„œ distance๋งŒํผ ๋ฐ˜๋ณต๋ฌธ์œผ๋กœ ํ•œ ์นธ์”ฉ ์ด๋™ํ•˜๋ฉฐ ์žฅ์• ๋ฌผ๊ณผ ๊ฒฝ๊ณ„๋ฅผ ๋„˜์–ด๊ฐ€๋Š”์ง€ ์ฒดํฌํ–ˆ๊ณ , ๋ฐ˜๋ณต๋ฌธ์—์„œ ๊ฑธ๋ฆฌ์ง€ ์•Š๋Š”๋‹ค๋ฉด robotPosition์„ ๋ฐ”๊ฟ”์ฃผ๊ณ  ๋‹ค์Œ ๋ช…๋ น์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ–ˆ๋‹ค.

 

โ€ป Set์„ ์‚ฌ์šฉํ•œ ์ด์œ  : ์ฒ˜์Œ์—๋Š” Array๋ฅผ ์‚ฌ์šฉํ•˜๋‹ค๊ฐ€ ์ด์ œ๋Š” ์‹œ๊ฐ„ ๋ณต์žก๋„๋„ ๊ณ ๋ ค๋ฅผ ํ•˜์ž๋ผ๋Š” ์ƒ๊ฐ์— ๋‚ด ๊ธฐ์–ต ์ €ํŽธ์— ํฌ๋ฏธํ•˜๊ฒŒ ๋‚จ์•„์žˆ๋˜ Set ๊ฐ์ฒด์— ๋Œ€ํ•ด ์ฐพ์•„๋ณด๊ณ  ์“ฐ๊ฒŒ ๋˜์—ˆ๋‹ค. has ๋ฉ”์„œ๋“œ๋Š” ๋ฐฐ์—ด์˜ length์™€ size๊ฐ€ ๊ฐ™์„ ๋•Œ includes ๋ฉ”์„œ๋“œ๋ณด๋‹ค ํ‰๊ท ์ ์œผ๋กœ ๋น ๋ฅด๋‹ค๊ณ  ํ•œ๋‹ค.

 

๋‹ค๋ฅธ ์‚ฌ๋žŒ ํ’€์ด

function solution(park, routes) {
        const dirs = { E: [0, 1], W: [0, -1], S: [1, 0], N: [-1, 0] };
        let [x, y] = [0, 0];
        for (let i = 0; i < park.length; i++) {
          if (park[i].includes('S')) {
            [x, y] = [i, park[i].indexOf('S')];
            break;
          }
        }

        routes.forEach((route) => {
          const [r, n] = route.split(' ');
          let [nx, ny] = [x, y];
          let cnt = 0;
          while (cnt < n) {
            [nx, ny] = [nx + dirs[r][0], ny + dirs[r][1]];
            if (!park[nx] || !park[nx][ny] || park[nx][ny] === 'X') break;
            cnt++;
          }
          if (cnt == n) [x, y] = [nx, ny];
        });
        return [x, y];
      }

 

dirs๋ฅผ ์„ ์–ธ ํ•ด์ฃผ์—ˆ๊ณ  park๋ฅผ ์ˆœํšŒํ•˜๋ฉฐ start point ๋ฅผ ์ง€์ •ํ•ด์ฃผ์—ˆ๋‹ค.  

๊ทธ๋ฆฌ๊ณ  routes ๋ฅผ forEach๋กœ ์ˆœํšŒํ•˜๋ฉฐ r ์ด๋ผ๋Š” ๋ฐฉํ–ฅ๊ณผ n์ด๋ผ๋Š” ์ด๋™ ๊ฑฐ๋ฆฌ๋ฅผ ์ถ”์ถœํ–ˆ๊ณ , cnt๋ฅผ 0์œผ๋กœ ์„ ์–ธ ํ›„ while ๋ฌธ์œผ๋กœ ๋งค ๋ฐ˜๋ณต๋งˆ๋‹ค cnt ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉฐ n๋ฒˆ๋งŒํผ ์‹คํ–‰ ๋  ์ˆ˜ ์žˆ๋„๋ก ํ–ˆ๋‹ค.

 

๊ทธ๋ฆฌ๊ณ  ๋ฐ˜๋ณต๋ฌธ ๋‚ด์—์„œ๋Š” nx์™€ ny๋ฅผ ์ง€์ •๋œ ๋ฐฉํ–ฅ(= r)์— ๋งž์ถฐ ํ•œ ์นธ์”ฉ ์ด๋™์‹œ์ผฐ๋‹ค.

!park[nx] : ์„ธ๋กœ์ถ• ๊ฒฝ๊ณ„๋ฅผ ๋ฒ—์–ด๋‚˜๋ฉด park[nx]๊ฐ€ undfined ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— !๋ฅผ ๋ถ™์—ฌ ๊ฐ€๋กœ์ถ• ๊ฒฝ๊ณ„๋ฅผ ์ฒดํฌํ•˜์˜€๋‹ค.

!park[nx][ny] : ๊ฐ€๋กœ์ถ• ๊ฒฝ๊ณ„๋ฅผ ๋ฒ—์–ด๋‚˜๋Š”์ง€๋„ ์œ„์™€ ๊ฐ™์€ ์›๋ฆฌ๋กœ ์ฒดํฌํ•˜์˜€๋‹ค.

park[nx][ny] === 'X' : ์ด๋™ํ•  ์ขŒํ‘œ์˜ ๊ฐ’์ด X๋ฉด break๊ฐ€ ๋˜๋„๋ก ํ•˜์˜€๋‹ค.

 

๋ฐ˜๋ณต๋ฌธ์ด ์‹คํ–‰๋˜๋Š” ๋™์•ˆ ์กฐ๊ฑด์„ ํ†ต๊ณผํ–ˆ์„ ๊ฒฝ์šฐ cnt๊ฐ€ ์ฆ๊ฐ€ํ• ํ…๋ฐ ์ฆ๊ฐ€ํ•œ cnt๊ฐ€ ์ด๋™๊ฑฐ๋ฆฌ n๊ณผ ์ผ์น˜ํ•œ๋‹ค๋ฉด ์ฒ˜์Œ ์ง€์ •ํ–ˆ๋˜ [x, y]์— ์ด๋™ํ•œ ์ขŒํ‘œ [nx, ny]๋ฅผ ํ• ๋‹นํ•˜๊ณ  ๋ชจ๋“  ๋กœ์ง์ด ๋‹ค ์‹คํ–‰๋˜๊ณ  ๋‚˜์„œ์˜ [x, y]๊ฐ’์„ returnํ•˜๋Š” ๋ฐฉ์‹์ด์—ˆ๋‹ค.

 

์žฅ์• ๋ฌผ์„ ๊ธฐ๋กํ•ด๋†“๊ณ  ์ฒดํฌํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์—ˆ๋Š”๋ฐ ์ด๋ ‡๊ฒŒ ํ•œ ์นธ์”ฉ ์›€์ง์ด๋ฉด์„œ ์ฒดํฌํ•ด๋„ ๋œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ๋๋‹ค...

Comments