본문 바로가기

알고리즘 문제풀이

[프로그래머스] 고득점 키트 - 그리디2

오늘 푼 문제

 

2. 조이스틱 / Lv.2 / 시간 : 89분(타임오버)

programmers.co.kr/learn/courses/30/lessons/42860?language=javascript

 

코딩테스트 연습 - 조이스틱

조이스틱으로 알파벳 이름을 완성하세요. 맨 처음엔 A로만 이루어져 있습니다. ex) 완성해야 하는 이름이 세 글자면 AAA, 네 글자면 AAAA 조이스틱을 각 방향으로 움직이면 아래와 같습니다. ▲ - 다

programmers.co.kr

function solution(name) {
    var answer = 0;
    let len = name.length;
    let pos = 0;
    let code = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    
    name = name.split('');
    
    while(!name.every(s=>s==='A')){
        for(let i=0; i<len; i++){
            if(name[pos+i]!==undefined && name[pos+i]!=='A'){ //right
                pos = pos+i;
                answer+=i;
                break;
            }else if(name[pos-i<0?len+pos-i:pos-i]!=='A'){ //left
                pos = pos-i<0?len+pos-i:pos-i;
                answer+=i;
                break;
            }
        }

        let upDown = code.indexOf(name[pos]);
        name[pos] = 'A'
        upDown = upDown>13?26-upDown:upDown;
        answer+=upDown;
    }
    
    return answer;
}

 

키포인트

1. 알파벳을 변경하는 부분보다 위치 이동에 신경써야 함. 알파벳 변경은 항상 A에서 시작하기 때문에 이전의 선택이 아무런 영향을 주지도 않음. N보다 큰 알파벳의 경우 커서를 아래로 이동하는 것만 신경쓰면 됨.

2. 이동의 경우 매번 현재 위치에서 오른쪽이나 왼쪽 중 A가 아닌 알파벳이 더 가까이 있는 곳으로 이동하는 걸 선택하면 됨. 그리디가 아니라 DFS 라는 의견이 보이는데 문제 설명이 헷갈리게 적혀 있어 그렇지 풀이 자체는 그리디가 맞다. 최종적인 조작 횟수의 최소화는 신경쓰지 말고 당장 최선의 선택만 하게 풀자.

 

 

헤맸던 부분 

1. 오른쪽으로 가는 경우나 왼쪽으로 가는 경우 모두 길이가 같을 때 오른쪽을 우선으로 가야함. (설명 진짜 개 날림으로ㅅㅂ 개빡침)

2. 커서가 처음 위치에서 왼쪽이나 아래쪽으로 overflow는 가능하지만, 마지막 위치에서 오른쪽이나 위쪽으로 overflow는 불허함.