기록하는 개발자

[프로그래머스][코딩테스트 고득점 Kit][Javascript] 조이스틱 본문

Algorithm

[프로그래머스][코딩테스트 고득점 Kit][Javascript] 조이스틱

밍맹030 2023. 8. 8. 14:02
728x90

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

 

프로그래머스

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

programmers.co.kr

 

아스키코드 표

A B C D E F G H I J
65 66 67 68 69 70 71 72 73 74
K L M N O P Q R S T
75 76 77 78 79 80 81 82 83 84
U V W X Y Z        
85 86 87 88 89 90        

 

→ B~M은 ▲ 를 사용하여 알파벳을 이동하고

N~Z는 ▼를 사용하여 알파벳을 이동한다

 

예시

완성할 이름 : BPAAAATSAAE

초기값 : AAAAAAAAAA

 

   1 ) i=0   

0번째 cursor 에서 ▲ 1번(66-65=1) 수행

 

   2) i=1   

1번째 cursor 에서 ▼ 11번(91-80=11) 수행

 

   3) i=2   

A가 4번 반복된다

이 때 cursor 를 ▶를 통해 T 앞까지 옮기는 것보다 (4칸 오른쪽으로)

◀를 통해 뒤로 가서 E 앞으로 옮기는 것이 (3칸 왼쪽으로)

최소로 움직일 수 있는 방법이다

전체코드

function solution(name) {
    let answer = 0;
    // min : A의 아스키코드 / max : Z의 아스키코드+1
    const min = 65; 
    const max = 90 + 1; 
    
    //A에서 특정 알파벳을 만드는 최소 조작
    const charToNum = (now) => {
        // 찾고자하는 문자의 아스키코드
        const num = now.charCodeAt();
        // A~M
        if(num < 78) return num-65;
        // N~Z
        else return 91-num;
    }
    
    const charArr = name.split('').map((c) => charToNum(c));
    let minMove = charArr.length - 1;
    
    charArr.forEach((nowCursor, index) => {
        answer += nowCursor;
        
        let nextCursor = index+1;
        // 연속되는 A 길이만큼 nextCursor 증가
        while(nextCursor < charArr.length && charArr[nextCursor] === 0) 
            nextCursor++;
        
        const toBack = charArr.length - nextCursor;
        // 오른쪽으로 가기, 왼쪽으로 가기, 뒤의 요소 먼저 입력
        minMove = Math.min(minMove, (index*2)+toBack, index+(2*toBack));
    })
    
    return answer + minMove;
}
728x90