티스토리 뷰

문제 링크

 

프로그래머스

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

programmers.co.kr

 

문제 설명

 

제한사항

 

입출력 예제

 

문제 풀이

조이스틱이 상/하 이동을 할 때 최소값을 구하고, 좌/우 이동할 때의 최소값을 구해야하는 것이 핵심이다.

 

상/하 이동

const changeCharToCode = (char) => {
    return char.charCodeAt();
}
    
const codeTable = {
    A:changeCharToCode("A"),
    Z:changeCharToCode("Z") + 1,
}

아스키코드로 변환하는 함수와 A,Z의 아스키 코드를 해시 테이블 형태로 저장. Z에 1을 더하는 이유는 A에서 Z로 바꾸기 위해 1회를 사용하기 때문이다.

 

좌/우 이동

뒤로 돌아가는 경우와, 순서대로 가는 경우에 대한 최소값을 구해준다.

const countChaningChar = (char) => {
    const currentCode = changeCharToCode(char);
    return Math.min(currentCode - codeTable["A"], codeTable["Z"] - currentCode);
}

 

주어진 문자열을 map 순회하여 좌, 우 이동의 최소값을 minMove의 변수에 계속 계산해주면서 최소값을 누적해서 값을 구해준다.

  • 순서대로 가는 것(name.length)
  • 뒤로 돌아 가는것(i * 2 + name.length - idx)
  • 뒷 부분을 먼저 입력하는 것(i + 2 * (name.length - idx)
let answer = 0;
let minMove = name.length - 1;
    
const totalCount = [...name].map((item, index) => {
    answer += countChaningChar(item);
    let nextIdx = index + 1;

    while(nextIdx < name.length && name.charAt(nextIdx) === "A") {
        nextIdx++;
    }

    minMove = Math.min(minMove, index * 2 + name.length - nextIdx, index + 2 * (name.length - nextIdx))
})

 

 

최종 코드

function solution(name) {
    const changeCharToCode = (char) => {
        return char.charCodeAt();
    }
    
    const codeTable = {
        A:changeCharToCode("A"),
        Z:changeCharToCode("Z") + 1,
    }
    
    const countChaningChar = (char) => {
        const currentCode = changeCharToCode(char);
        return Math.min(currentCode - codeTable["A"], codeTable["Z"] - currentCode);
    }
    
    let answer = 0;
    let minMove = name.length - 1;
    
    const totalCount = [...name].map((item, index) => {
        answer += countChaningChar(item);
        let nextIdx = index + 1;
        
        while(nextIdx < name.length && name.charAt(nextIdx) === "A") {
            nextIdx++;
        }
        
        minMove = Math.min(minMove, index * 2 + name.length - nextIdx, index + 2 * (name.length - nextIdx))
    })
    return answer + minMove;
}

 

마무리

다 생각했던 풀이 방식인데 코드로 구현하는게 어렵다... 다시 풀어보쟈