Algorithm

[Programmers] 조이스틱(JS)

검정색필통 2023. 3. 31. 08:48

1. 문제

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

2. 풀이

String.charCodeAt() 이용 문자열을 아스키코드로 변환한다.

왼쪽에서부터 오른쪽으로 이동하면서 A와 비교해서 오름차순이 이득인지 내림차순이 이득인지 판단하여 더 이득인쪽을 더한다.

0부터 length-1까지 시작한 index를 기준으로 연속된 A를 파악해

  1. 처음부터 오른쪽으로 쭉 가는게 이득인지
  2. 오른쪽으로 갔다가 멈춰서 반대편으로 돌아서 연속된 A가 끝나는 지점까지 돌아가는게 이득인지
  3. 처음부터 왼쪽으로 갔다가 연속된 A가 끝나는 지점에서 다시 돌아서 오른쪽으로 가서 index에서 멈추는게 이득인지 비교한다.

3. 결과

 

4. 코드

function solution(name) {
    let answer = 0;
    let minCursorMoveCnt = name.length - 1;
    
    for(let i=0; i<name.length; i++){
        answer += Math.min(name.charAt(i).charCodeAt()-65, 91-name.charAt(i).charCodeAt());
        let lastAIndex = i+1;
        while(lastAIndex<name.length && name.charAt(lastAIndex)==='A'){
            lastAIndex++;
        }
        minCursorMoveCnt = Math.min(minCursorMoveCnt, i*2 + name.length - lastAIndex, i + (name.length - lastAIndex)*2);
        
    }
    return answer + minCursorMoveCnt;
}

5. 어려웠던 점

A가 연속하지 않고 끊겼을 때 처리를 어떻게 해주어야 되나에 대한 고민이 길었는데 길이가 20밖에 안되서 걍 모든 지점에서 while문 돌려서 다 체크해주면 되는거라… 헛고생 좀 했음