티스토리 뷰

코딩테스트

[프로그래머스] 조이스틱

빅또리 2021. 4. 13. 18:22
function solution(name) {
    // 1
    let arr = [...name.matchAll(/[^A]/g)].map(x=>x.index);
    const dis0 = i => Math.min(i, name.length-i);     //0과의 거리
    const dis = (a,b) => {                           //a부터 b까지 돌기                
        if(a==b) return dis0(a);
        else if(a < b) return Math.min(dis0(a),dis0(b))+b-a;
        else return Math.min(dis0(a), dis0(b))+name.length+b-a;
    }

    let horiz = 0;
    if(arr.length==0) return 0;
    else if(arr.length==1){
        horiz=dis0(arr[0]);
    }
    else{
        horiz = arr.reduce((h,x,i,arr)=>{
            if(i===arr.length-1){ //마지막 요소
                return Math.min(h, dis(arr[0], x));
            }else{
                return Math.min(h, dis(arr[i+1], x));
            }
        },name.length)     
        
    };
    // 2
    let vert = name.split('').reduce((a,x)=>{
        const ascii = x.charCodeAt(0);
        return a+=Math.min(ascii-65, 91-ascii);
    },0);
    return horiz+vert;
}

1. horiz : <> 움직이는 횟수

 

1) dis0 : 0으로 부터 최소한 움직여서 가는 횟수

2) dis (a,b) : 초기에 0에 있다고 가정하고 a부터 b까지 도는 최소 횟수

   'A'가 아닌 인덱스 찾아서 i, i+1 사이엔 'A'만 있는 거니까 둘을 끝단으로 해서 나머지 부분 돌기

   한 것들중 최솟값 = horiz

 

2. vert : ↕ 움직이는 횟수

 

댓글
공지사항
최근에 올라온 글