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