[JavaScript][Programmers] 조이스틱

조준형·2021년 7월 8일
0

Algorithm

목록 보기
18/142
post-thumbnail

🔎 조이스틱

❓ 문제링크

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가 틀렸다고 나온다.

오른쪽으로만 가다가 왼쪽트는경우를 어떻게 생각하지 고민하다가 다른사람의 코드를 보았다.
근데 아직 잘 모르겠다.

📘 참고

https://beop07.tistory.com/32

profile
깃허브 : github.com/JuneHyung

0개의 댓글