FrontEnd/프로그래머스

[JS] 조이스틱

728x90

문제가 그리디 파트에 있어서 곰곰히 생각해봤는데 결국 이 문제는

 

알파벳을 돌리는 최소개수 + 조이스틱을 좌우로 돌리는 최소 개수를 구하는 문제였다.

 

알파벳을 돌려서 나오게 하는 최소개수는 사실 쉽다. N보다 작을때는 그냥, N보다 뒤에나오는 알파벳이 나오면 26에서 뺀 값을 주면 된다.

(이부분이 그리디인가?)

 

 

문제는 조이스틱을 좌우로 돌리는 최소를 찾는 부분이었다.

 

"BBBAAAAAAAB"

"BAAABAAAAAAAAAAAB"

 

위와같이 한쪽으로만 가지 않고 쭉 가거나, A가나와도 우선 진행한 후에 돌아와야하는 케이스들이 많았기 때문이다.

 

 

문제를 읽어보니 입력으로 주어지는 문자의 총 케이스가 20개라서 그냥 완전탐색을 활용해서 체크하면 되겠다 라는 생각이 들었다.

 

따라서 dfs방식으로 좌우를 계산해줬다.

 

 

 

위 방식으로 풀었는데 16,17케이스에서 자꾸 통과가 안되었다.

 

원인은 "AAAAAAAA"로 들어오는 경우가 있을 수 있는 것

 

해당 경우를 예외처리 해주었더니 통과되었다.

 

 

 

function solution(name) {
    
    if (!name.replaceAll('A',"").length) return 0
    
    const alphaToNum = (str) => {
        const n = str.charCodeAt()-65
        return n > 12 ? 26-n : n
    }
    let ret = 0
    
    for (const s of name){
        ret += alphaToNum(s)
    }
    
    const dfs = (arr,idx,step,dp) => {
        const tmpArr = [...arr]
        const tmpDp = [...dp]
        tmpArr[idx] = 'A'
        tmpDp[idx] += 1
        
        if (arr.every(v => v==='A')) return step -1
        if (tmpDp[idx] >2) return name.length-1
        
        const leftIdx = idx === 0 ? name.length-1 : idx-1
        const rightIdx = idx === name.length-1 ? 0 : idx+1
        
        const left = dfs(tmpArr,leftIdx,step+1,tmpDp)
        const right = dfs(tmpArr,rightIdx,step+1,tmpDp)
        
        return Math.min(left,right)
        
        }
    
    
    const arr = [...name]
    const dp = new Array(name.length).fill(0)
    
    return ret + dfs(arr,0,0,dp) 
}
728x90

'FrontEnd > 프로그래머스' 카테고리의 다른 글

[JS] H-Index  (0) 2023.07.05
[JS] 소수 찾기  (0) 2023.07.02
[JS] 큰 수 만들기  (0) 2023.06.29
[JS] 구명 보트  (0) 2023.06.29
[JS] 오픈채팅방  (0) 2023.06.28