fullfish 2022. 8. 11. 19:20

처음에는 아래 코드와 같이 현재 손가락의 위치와 주어진 숫자의 차이로 구해보려고했다

 

첫 코드

function solution(numbers, hand) {
  let result = "";
  let nowL = 10;
  let nowR = 12;
  for (let i = 0; i < numbers.length; i++) {
    result += check(numbers[i], hand);
  }
  return result;
}

const check = (num, hand) => {
  console.log(nowL, nowR);
  if (num === 1 || num === 4 || num === 7) {
    nowL = num;
    return "L";
  } else if (num === 3 || num === 6 || num === 9) {
    nowR = num;
    return "R";
  } else {
    if (Math.abs(num - nowL) > Math.abs(num - nowR)) {
      numR = num;
      return "R";
    } else if (Math.abs(num - nowL) < Math.abs(num - nowR)) {
      numL = num;
      return "L";
    } else {
      if (hand === "right") {
        numR = num;
        return "R";
      } else {
        numL = num;
        return "L";
      }
    }
  }
};

그러다가 계속 막혀서 아예 다른방법인

각 숫자의 좌표평면상의 좌표(배열의 인덱스)를 구해서

멘하탄 거리로 계산을 해서 풀었다

 

코드

function solution(numbers, hand) {
  let result = "";
  let matrix = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9],
    [10, 0, 11],
  ];
  let nowL = [3, 0];
  let nowR = [3, 2];

  const check = (num, hand) => {
    const findLength = (num, finger) => {
      let numArr = findIndex(num);
      return Math.abs(finger[0] - numArr[0]) + Math.abs(finger[1] - numArr[1]);
    };
    if (num === 1 || num === 4 || num === 7) {
      nowL = findIndex(num);
      return "L";
    } else if (num === 3 || num === 6 || num === 9) {
      nowR = findIndex(num);
      return "R";
    } else {
      if (findLength(num, nowL) > findLength(num, nowR)) {
        nowR = findIndex(num);
        return "R";
      } else if (findLength(num, nowL) < findLength(num, nowR)) {
        nowL = findIndex(num);
        return "L";
      } else {
        if (hand === "right") {
          nowR = findIndex(num);
          return "R";
        } else {
          nowL = findIndex(num);
          return "L";
        }
      }
    }
  };

  const findIndex = (num) => {
    for (let i = 0; i < matrix.length; i++) {
      if (matrix[i].indexOf(num) !== -1) return [i, matrix[i].indexOf(num)];
    }
  };

  for (let i = 0; i < numbers.length; i++) {
    result += check(numbers[i], hand);
  }
  return result;
}