https://programmers.co.kr/learn/courses/30/lessons/42860
function solution(name) {
let alpha = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.split('');
// console.log(alpha);
let arr = [];
let answer = 0;
for( i in name){
arr.push(alpha.indexOf(name[i]));
answer += (alpha.indexOf(name[i]) <= 13) ? alpha.indexOf(name[i]) : 26 - alpha.indexOf(name[i]);
}
let move = name.length - 1;
for (var i in arr) {
if (arr[i] == 0) {
var cnt0 = 1;
for (let j = parseInt(i) + 1; j < arr.length; j++) {
if (arr[j] == 0) cnt0++;
else break;
}
}
let left_move = (i == 0) ? 0 : (parseInt(i) - 1) * 2;
let left = left_move + (arr.length - cnt0 - parseInt(i));
if (move > left) move = left;
}
return answer+move;
}
// let name = "JEROEN";
// let name = "JAZ"; // 위 9번, 우 2번,
let name = "ABAAAAAAAAABB"; // testcase 11
console.log(solution(name));
먼저, 이름 글자의 위아래 방향키를 누르는 횟수를 더해줍니다.
ABCD~~XYZ까지의 문자열을 split으로 나누어 answer에 해당 글자의 index를 더합니다.
그 다음 만약 arr[i]=0이면, 즉 A라면 cnt0은 1이고, 그 다음글자부터 0이 있으면 cnt0을 더하고 아니면 멈춘다.
A가 아닐 때 첫 글자면 0, 아니면 해당 인덱스에서 -1
이 때 13이 중간지점이므로 13이 넘어가면 26에서 빼줍니다.
move는 오른쪽으로 가는 횟수.
left_move는 오른쪽으로가다가 왼쪽으로 가는 경우.
left는 왼쪽으로 가는경우
(아직 잘 모르겠다 ;;)
function solution(name) {
let alpha = {
'A': 0, 'B': 1, 'C': 2, 'D': 3, 'E': 4, 'F': 5, 'G': 6, 'H': 7, 'I': 8, 'J': 9,
'K': 10, 'L': 11, 'M': 12, 'N': 13, 'O': 12, 'P': 11, 'Q': 10, 'R': 9, 'S': 8, 'T': 7,
'U': 6, 'V': 5, 'W': 4, 'X': 3, 'Y': 2, 'Z': 1
}
let arr = []
for (var i = 0; i < name.length; i++) {
arr.push(name.charAt(i));
}
let start = new Array(name.length).fill('A');
console.log(arr + '/' + start);
let right = 0;
let r = 0;
while (r < arr.length) {
console.log(`${r} 전: ${arr.join('')}, ${start.join('')}`)
right += alpha[arr[r]];
start[r] = arr[r];
console.log(`${r} 후: ${arr.join('')}, ${start.join('')}`)
if (arr.join('') == start.join('')) {
console.log(r);
right += r;
break;
}
r++;
}
start = new Array(name.length).fill('A');
let left = alpha[arr[0]] + 1;
start[0] = arr[0];
let l = arr.length - 1;
let cnt = 0;
while (l > 0) {
console.log(`${l} 전: ${arr.join('')}, ${start.join('')}`)
left += alpha[arr[l]];
start[l] = arr[l];
console.log(`${l} 전: ${arr.join('')}, ${start.join('')}`)
if (arr.join('') == start.join('')) {
console.log(l);
left += cnt;
break;
}
l--;
cnt++;
}
console.log(`r: ${right}, l:${left}`)
let answer = Math.min(right, left);
return answer;
}
// let name = "JEROEN";
// let name = "JAZ"; // 위 9번, 우 2번,
let name = "ABAAAAAAAAABB"; // testcase 11
console.log(solution(name));
초기에 위와같이 ABC~XYZ의 값을 저장해놓고, 해당값을 바꿔가며 생각했는데
위의 경우 아예 오른쪽으로만가던가, 아니면 왼쪽으로만 가던가 . 이것만 생각해 11번 testcase가 틀렸다고 나온다.
오른쪽으로만 가다가 왼쪽트는경우를 어떻게 생각하지 고민하다가 다른사람의 코드를 보았다.
근데 아직 잘 모르겠다.