[프로그래머스] 조이스틱(javascript)

프린이·2021년 6월 15일
2

  • 제 코드는 최선의 방안은 아닙니다.
  • 단순히 기록용, 공유용이니 이 점 보실 때, 참고바랍니다!

🔗 문제 링크

https://programmers.co.kr/learn/courses/30/lessons/42860

📙 풀이 과정

📝 답안 코드

function solution(name) {
    var answer = 0;
    var name = name.split('');
    var alphabet = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 
                    'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 
                    'W', 'X', 'Y', 'Z'];
    var alphabetG = alphabet.slice();
    var alphabetB = alphabet.reverse();
    alphabetB.unshift('A');
    
    for(var i = 0; i < name.length; i++){
        //* 현재 알파벳이 'A'가 아닐 때, *//
        if(name[i] != 'A'){
            if(i != 0) answer++;
            var go = alphabetG.indexOf(name[i]);
            var back = alphabetB.indexOf(name[i]);
            go > back ? answer += back : answer += go;
        }
        //* 현재 알파벳이 'A'일 때, *//
        else{
            //* 바꿔야하는 글자가 안남았을 때 *//
            var tmp = name.slice(i, name.length);
            tmp = [...new Set(tmp)];
            if(tmp.join("") == 'A'){
                break;
            }
            
            //* 바꿔야하는 글자가 남았을 때 *//
            var cnt = 0;
            
            //현재 위치에서 맨 뒤로 되돌아가는 횟수
            var bTmp;
            var a = 0;
            if(i > 0){
                // 지금 위치는 A뒤에 커서가 되어 있는거니까
                // 원래 있던 커서 자리로 돌려놓기위함
                a = i - 1;
            }
            if(name[name.length - 1] != 'A'){
                bTmp = 0;
                while(a != 0){
                    bTmp++;
                    a--;
                }
                bTmp++;
            }
            
            //현재 위치에서 원래 방향으로 가는게 빠른지 확인
            for(var j = i; j < name.length; j++){
                if(j != 0) cnt++;
                if(name[j] != 'A'){
                    break;
                }
            }
            // 맨 뒤로 돌아가서 하는게 더 빠를 때,
            if(cnt > bTmp){
                name = name.slice(i,name.length).reverse();
                i = -1;
                answer += bTmp;
            }
            else{
                i = j - 1;
                // 뒤로 돌아가서 'A'아닌 위치에서 하는게 더 빠를 때,
                if(cnt >= Math.ceil(name.length / 2)){
                    cnt = name.length - cnt;
                }
                answer += cnt - 1;
            }
        }
    }
    return answer;
}

🟡 느낀 점

  • 문제 자체를 이해하는데는 오래 걸리지 않았지만, 생각해야하는 경우의 수가 너무 많아서 예전에 1월에 풀었을 땐, 몇 몇의 테스트케이스에 실패했고 코드도 훨씬 지저분했었다.
  • 그래도 몇 개월 지나온 동안 여러 문제 연습했다고 보다 나은 코드로 해결까지해서 개인적으론 뿌듯함이 남는다.
  • 앞으론 다방면의 케이스까지 생각할 줄 아는 사고를 가져서 하면 더 좋을 것 같다!!
profile
주니어 프론트엔드개발자

0개의 댓글