몸과 마음이 건전한 SW 개발자

프로그래머스 [Lv. 2] 조이스틱 {언어 : JavaScript} [꼭 다시 보기] 본문

알고리즘/꼭 다시 보기

프로그래머스 [Lv. 2] 조이스틱 {언어 : JavaScript} [꼭 다시 보기]

스위태니 2024. 11. 21. 17:38
728x90

문제 링크

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

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

정답 코드

function solution(name) {
    const aCode = "A".charCodeAt();
    const zCode = "Z".charCodeAt() + 1;
    const lenN = name.length;
    let answer = 0
    
    const moveCost = (char) => {
        const charCode = char.charCodeAt();
        return Math.min(charCode - aCode, zCode - charCode);
    }
    
    for (const char of name) {
        answer += moveCost(char);
    }
    
    let minMove = lenN - 1;
    for (let i = 0; i < lenN; i++) {
        let ni = i + 1;
        while (ni < lenN && name.at(ni) === "A") {
            ni += 1;
        }
        
        const distance = Math.min(i, lenN - ni) + i + lenN - ni;
        minMove = Math.min(minMove, distance);
    }
    
    answer += minMove;
    return answer;
}

풀이 방법

  1. 좌에서 우로 이동하면서 모든 알파벳에 변경 값을 최소로 구한 뒤 answer에 더한다.
  2. 이후 다시 좌에서 우로 이동하면서 A가 아닌 위치로 최소한으로 이동한 거리를 구한다.
  3. 이 거리는 계속 갱신되고 이동이 끝나면 answer에 더해준다.
  4. answer를 반환하면 끝!

느낀점

  • 100번은 다시 풀어봐도 제대로 소화시킬 수 있을까 싶다.
  • 아직 이정도 풀이를 떠올리지 못하는게 아쉽다.
728x90