[Algorithm] Programmers_조이스틱

function solution(name) {
    var answer = 0;
    
    let ascCnt = 0;
    let descCnt = 0;
    
    let nameArr = name.split("");
    let forwardArr = name.split("");
    let reverseArr = forwardArr.slice(0, 1).concat(name.split("").reverse().slice(0, name.length - 1));
    
    if (nameArr.filter((x) => x != "A").length < 1) return 0;
    
    for (var i = 0; i < name.length; i ++) {
        if (forwardArr.filter((x) => x != "A").length > 0) {
            ascCnt++;   
            forwardArr = forwardArr.slice(1);
            let lastChar = "";
            if (forwardArr.length * 1.0 / 2 < forwardArr.findIndex((x) => x != "A")) {
                lastChar = forwardArr[0];
                forwardArr.reverse();
                forwardArr.pop();
                forwardArr.unshift(lastChar);
            }
        }
        if (reverseArr.filter((x) => x != "A").length > 0) {
            descCnt++;
            reverseArr = reverseArr.slice(1);
        }
    }
    ascCnt = ascCnt > 0 ? ascCnt-1 : 0;
    descCnt = descCnt > 0 ? descCnt-1 : 0;
    
    for (var i = 0; i < nameArr.length; i ++) {
        if (nameArr[i] == 'A') continue;
        
        let code = nameArr[i].charCodeAt();
        
        if (code > 78) {
            answer += 25 - Math.abs(code - 65) + 1;
        } else {
            answer += Math.abs(code - 65);
        }
    }
    
    answer = ascCnt > descCnt ? answer + descCnt : answer + ascCnt;
    
    return answer;
}

처음 문제 풀 때 고려했던 4가지는 아래와 같다

  • 아스키코드로 절대값(A-B) 계산해서 위 아래 중 뭐가 적은지 비교
  • 절대값이 12 초과 차이 나면 반대로 가야함
  • 만들어야 할 단어가 A 면 스킵하고 넘어가기
  • 글자 수 비교해서 왼쪽으로 이동하는게 빠른지 오른쪽으로 이동하는게 빠른지 체크

그런데 위 4가지만 고려하고 코드를 짰을 때는, 테스트케이스에서 1개가 계속 실패했다.

추가로 고려해야했던 상황은
처음엔 정방향으로 갔다가 다시 역순으로 가는게 빠를 때! 이 케이스를 누락했다.

어차피 첫 번째 문자에서 왼쪽 커서를 눌러 오른쪽으로 가게되면 다시 오른쪽으로는 갈 수 없기 때문에
if (forwardArr.length * 1.0 / 2 < forwardArr.findIndex((x) => x != "A")) 이 if 문에 걸리는 경우 그냥 배열을 첫 번째 문자 제외하고 역순으로 뒤집어 버렸다.

어렵다 어려워 알고리즘...
더 좋은 방법이 없나 서치 좀 해봐야겠다.

좋은 웹페이지 즐겨찾기