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

skyblue·2023년 12월 19일
0

코딩테스트

목록 보기
4/4

서두

난 조이스틱을 모른다. 그래서 문제 자체를 이해하기 어려웠다.

문제 이해

  • 이전, 다음 알파벳으로 이동은 직관적으로 이해된다.

  • 커서를 왼쪽, 오른쪽으로 이동한다는 의미는?
    테스트 1번 문제로 예를 들면,

    • 오른쪽으로만 이동한다면
      AAAAAA
      -12345
      총 다섯번 움직인다.

    • 두 번째 문자에서 뒤로 돌아간다면
      AAAAAA
      216543
      총 여섯번 움직인다.

  • 뒤로 가는 경우는?
    BBAAB
    -1234
    보다
    BBAAB
    21--3
    이 더 적게 이동한다.

풀이

function solution(name) {
  	// 알파벳 조작 횟수
    let sum = 0;
  
    for (let i = 0; i < name.length; i++) {
        let diff = name[i].charCodeAt() - 'A'.charCodeAt();
        sum += diff > 13 ? 26 - diff : diff;
    }

  	// 문자로 이동한 횟수
    let minMove = name.length - 1; // 오른쪽으로만 마지막 문자까지 이동한 경우
  
    for (let i = 0; i < name.length; i++) {
      	// 만들어야 하는 name에 A가 포함된 경우
      	// A에는 커서를 이동하지 않아도 된다
      	// 즉, 이동 수가 줄 수도 있다
        if (name[i] === 'A') {
            let j = i + 1;
          	// i 다음 'A'가 아닌 문자 위치는 j
            while (j < name.length && name[j] === 'A') {
                j++;
            }
			
            const right = i - 1; // 0번째 문자부터 i-1번째 문자까지 이동 수
            const left = name.length - j; // 0번째 문자부터 왼쪽으로 커서를 이동하여 j번째 문자까지 이동 수
            minMove = Math.min(minMove, left > right ? left + right * 2 : left * 2 + right);
            // 'BBAA' 같이 오른쪽으로 이동하다 멈추는 경우
          	// left === 0 이다
          	// 마지막 문자가 'A'이므로 j === 마지막 인덱스+1
          	// 결과적으로 left * 2는 0으로 오른쪽으로만 i-1까지 이동
          	//'AABB'와 같은 경우도 마찬가지
          	// 왼쪽으로만 j까지 이동 
            i = j;
        }
    }

    return sum + minMove;
}

0개의 댓글