ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Programmers] JavaScript 알고리즘 | Lv.0 캐릭터의 좌표
    ► JS Algorithm/Programmers 2024. 9. 8. 11:01
    반응형

    🔒 문제 설명

    머쓱이는 RPG게임을 하고 있습니다. 게임에는 up, down, left, right 방향키가 있으며 키를 누르면 , 아래, 왼쪽, 오른쪽으로 칸씩 이동합니다. 예를 들어 [0,0]에서 up 누른다면 캐릭터의 좌표는 [0, 1], down 누른다면 [0, -1], left 누른다면 [-1, 0], right 누른다면 [1, 0]입니다. 머쓱이가 입력한 방향키의 배열 keyinput 맵의 크기 board 매개변수로 주어집니다. 캐릭터는 항상 [0,0]에서 시작할 입력이 모두 끝난 뒤에 캐릭터의 좌표 [x, y] return하도록 solution 함수를 완성해주세요.

    • [0, 0] board 중앙에 위치합니다. 예를 들어 board 가로 크기가 9라면 캐릭터는 왼쪽으로 최대 [-4, 0]까지 오른쪽으로 최대 [4, 0]까지 이동할 있습니다.

    🔒 제한사항 

    • board은 [가로 크기, 세로 크기] 형태로 주어집니다.
    • board의 가로 크기와 세로 크기는 홀수입니다.
    • board의 크기를 벗어난 방향키 입력은 무시합니다.
    • 0 ≤ keyinput의 길이 ≤ 50
    • 1 ≤ board[0] ≤ 99
    • 1 ≤ board[1] ≤ 99
    • keyinput 항상 up, down, left, right 주어집니다.

    🔒 입출력 예

    keyinput board result
    ["left", "right", "up", "right", "right"] [11, 11] [2, 1]
    ["down", "down", "down", "down", "down"] [7, 9] [0, -4]

    🔒 입출력 예 설명

    입출력 예 설명 #1

    • [0, 0]에서 왼쪽으로 한 칸 오른쪽으로 한 칸 위로 한 칸 오른쪽으로 두 칸 이동한 좌표는 [2, 1]입니다.

    입출력 예 설명 #2

    • [0, 0]에서 아래로 다섯 이동한 좌표는 [0, -5]이지만 맵의 세로 크기가 9이므로 아래로는 칸을 넘어서 이동할 없습니다. 따라서 [0, -4] return합니다.

     

    🔐 solution of mine

    Math.floor()

    switch

    function solution(keyinput, board) {
      const [x, y] = board;
      let [a, b] = [0, 0];
    
      const halfX = Math.floor(x / 2);
      const halfY = Math.floor(y / 2);
    
      const chkMaxX = [-halfX, halfX];
      const chkMaxY = [-halfY, halfY];
    
      for (let i = 0; i < keyinput.length; i++) {
        switch (keyinput[i]) {
          case "left":
            chkMaxX[0] < a && a <= chkMaxX[1] && a--;
            break;
    
          case "right":
            chkMaxX[0] <= a && a < chkMaxX[1] && a++;
            break;
    
          case "up":
            chkMaxY[0] <= b && b < chkMaxY[1] && b++;
            break;
    
          case "down":
            chkMaxY[0] < b && b <= chkMaxY[1] && b--;
            break;
        }
      }
    
      return console.log([a, b]);
    }
    
    solution(["left", "right", "up", "right", "right"], [11, 11]); // expected output: [2, 1]
    solution(["down", "down", "down", "down", "down"], [7, 9]); // expected output: [0, -4]
    solution(["right", "right", "right", "right", "right", "left"], [9, 5]); // expected output: [3, 0]

     


     

    🔐 GPT's solution

    Math.floor()

    Math.max()

    Math.min()

    function solution(keyinput, board) {
      let position = [0, 0]; // 현재 좌표를 [0, 0]으로 시작
    
      // 보드의 가로, 세로 최대 이동 가능한 범위 계산
      const xLimit = Math.floor(board[0] / 2);
      const yLimit = Math.floor(board[1] / 2);
    
      // 방향에 따른 이동값 정의
      const move = {
        up: [0, 1],
        down: [0, -1],
        left: [-1, 0],
        right: [1, 0],
      };
    
      // keyinput 배열에 따라 이동
      keyinput.forEach((key) => {
        position[0] += move[key][0];
        position[1] += move[key][1];
    
        // 맵의 범위를 벗어나지 않도록 제한
        position[0] = Math.max(-xLimit, Math.min(xLimit, position[0]));
        position[1] = Math.max(-yLimit, Math.min(yLimit, position[1]));
      });
    
      return console.log(position);
    }
    
    solution(["left", "right", "up", "right", "right"], [11, 11]); // expected output: [2, 1]
    solution(["down", "down", "down", "down", "down"], [7, 9]); // expected output: [0, -4]
    solution(["right", "right", "right", "right", "right", "left"], [9, 5]); // expected output: [3, 0]

     

    🔐 solution of others

    switch

    function solution(keyinput, board) {
      let res = [0, 0];
      for (let p of keyinput) {
        switch (p) {
          case "left":
            if (-res[0] < board[0] / 2 - 1) res[0]--;
            break;
          case "right":
            if (res[0] < board[0] / 2 - 1) res[0]++;
            break;
          case "up":
            if (res[1] < board[1] / 2 - 1) res[1]++;
            break;
          case "down":
            if (-res[1] < board[1] / 2 - 1) res[1]--;
        }
      }
      return console.log(res);
    }
    
    solution(["left", "right", "up", "right", "right"], [11, 11]); // expected output: [2, 1]
    solution(["down", "down", "down", "down", "down"], [7, 9]); // expected output: [0, -4]
    solution(["right", "right", "right", "right", "right", "left"], [9, 5]); // expected output: [3, 0]

    🔐 solution of others

    Array.prototype.map()

    Array.prototype.reduce()

    Math.abs()

    function solution(keyinput, board) {
      let key = { right: [1, 0], left: [-1, 0], up: [0, 1], down: [0, -1] };
    
      let rslt = keyinput
        .map((v) => key[v])
        .reduce(
          (a, b) => {
            if (
              Math.abs(a[0] + b[0]) > board[0] / 2 ||
              Math.abs(a[1] + b[1]) > board[1] / 2
            ) {
              return [a[0], a[1]];
            }
            return [a[0] + b[0], a[1] + b[1]];
          },
          [0, 0]
        );
    
      return console.log(rslt);
    }
    
    solution(["left", "right", "up", "right", "right"], [11, 11]); // expected output: [2, 1]
    solution(["down", "down", "down", "down", "down"], [7, 9]); // expected output: [0, -4]
    solution(["right", "right", "right", "right", "right", "left"], [9, 5]); // expected output: [3, 0]

     

    🔐 solution of others

    Array.prototype.reduce()

    const CONTROL = {
      up: [0, 1],
      down: [0, -1],
      left: [-1, 0],
      right: [1, 0],
    };
    
    function solution(key, [n, m]) {
      const [x1, x2] = [-(n - 1) / 2, (n - 1) / 2];
      const [y1, y2] = [-(m - 1) / 2, (m - 1) / 2];
    
      return console.log(
        key.reduce(
          ([x, y], k) => {
            const [nx, ny] = [x + CONTROL[k][0], y + CONTROL[k][1]];
    
            if (x1 <= nx && nx <= x2 && y1 <= ny && ny <= y2) return [nx, ny];
            return [x, y];
          },
          [0, 0]
        )
      );
    }
    
    solution(["left", "right", "up", "right", "right"], [11, 11]); // expected output: [2, 1]
    solution(["down", "down", "down", "down", "down"], [7, 9]); // expected output: [0, -4]
    solution(["right", "right", "right", "right", "right", "left"], [9, 5]); // expected output: [3, 0]

     

    반응형
Designed by Tistory.