
Lv2. 조이스틱 Javascript
https://programmers.co.kr/learn/courses/30/lessons/42860#
function solution(name) {
  let numA = "A".charCodeAt(); // 65
  let numZ = "Z".charCodeAt(); // 90
  const nums = [...name].map((item) => {
    const number = item.charCodeAt();
    return number - numA > numZ - number ? numZ - number + 1 : number - numA;
  });
  let result = nums.reduce((acc, cur) => acc + cur, 0);
  let index = 0;
  let len = nums.length;
  while (nums.some((el) => el !== 0)) {
    let next = 0;
    for (let i = 0; i < len; i++) {
      let right = (index + i) % len;
      let left = (index - i + len) % len;
      if (nums[right] !== 0) {
        next = right;
      } else if (nums[left] !== 0) {
        next = left;
      } else {
        continue;
      }
      nums[next] = 0;
      result += i;
      break;
    }
    index = next;
  }
  return result;
}
그리디(탐욕) 알고리즘을 배경으로, 각각의 자리에서 최선의 방법을 찾는다.
💡 각 자리 조작 & 자리 이동
자리 이동을 하면서 각 자리에서 조작(▲▼)하는 횟수를 따로 더할 수도 있지만,
좌로가든 우로가든 각 자리에서의 조작의 합은 같으므로 먼저 result에 더해줌
💡 자리 이동 Count (◀▶) - 4번 과정
if : right,else if : left순서
테스트 케이스 추가 :const name = "ZZAAAZZ"result = 8
right와 left가 동률일 경우,right로 가면8이 나오지만,left로 가면9가 나온다.
논란이 많은 문제
풀이 시간이 매우 오래걸렸고, 결국 구글링읕 통해 해결.
고려해야할 조건이 많았고, 변수가 다양해서 생각하는데 또 오래걸렸다.
댓글 환영 질문 환영
by.protect-me