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

Kyle·2020년 12월 6일
0

problem solving

목록 보기
5/36

문제 : 조이스틱

문자열이 주어지면 문자열을 AAA에서 시작해 몇번만에 만들 수 있는 지 구하는 문제

문제 : https://programmers.co.kr/learn/courses/30/lessons/42860#

해결방법

  1. 알파벳을 맞추는 것은 아스키코드로 비교하면 간단하게 해결 가능하다.

알파벳이 움직이는 횟수를 count해서 answer에 더해준다.

  1. 알파벳 하나를 완성하고 옆으로 움직이는 케이스를 정해준다.

단, 맨 왼쪽에서 < 하면 맨 뒤로 넘어간다. 하지만 맨 오른쪽에서 > 한다고 앞으로 오지는 않는다. 문제를 잘못 해석해서 첫시도에는 실패했던 문제다. 이 점만 주의하면 간단히 해결가능하다.

  1. name을 돌면서 A가 연달아서 나오는 횟수시작 index를 aList배열에 객체 (idx:~~ , cnt:~~)로 저장한다.
  2. A가 연달아서 가장 많이 나온 순서로 정렬한다. (앞에 0번 인덱스로만 비교하면 된다.)
    • A가 가장많이 연달아 나온 것에서 back할지 안할지 결정해야 된다.
  3. A가 연달아서 나온 개수 vs 그 앞에 문자의 개수(저장한 index 이용)를 비교
  • 연달아 나온 A 수가 더 많거나 같으면 back을 해야된다.
    - (전체길이-A길이-1)+(A앞에나온 문자의 개수-1) 의 식으로 구할 수 있다.

    (A없이 진행한다고 생각)+(back할 때 거쳐가는 것들) <- 이렇게 생각해서 식을 작성하면된다.

  • 앞에 숫자가 더 많은 경우 그냥 진행한다.
    - (전체길이 -1)

코드

function solution(name) {
    let answer = 0;
    let aList =[]
    let turn =0
    for(const char of name){
        answer+=changeCharCount(char)
    }
    if(name[0]==="A") aList.push({idx:0,cnt:1})
    for(let i=1; i<name.length; i++){
        if(name[i-1]==="A" && name[i]==="A"){
            aList[aList.length-1].cnt++
        }else if(name[i-1]!=="A" && name[i]==="A"){
            aList.push({idx:i,cnt:1})
        }
    }
    aList.sort((a,b)=>b.cnt-a.cnt)
    //앞에 있는 개수보다 A개수가 더 많을때
    if(aList.length && aList[0].idx<=aList[0].cnt){
        turn = (name.length-aList[0].cnt-1)+(aList[0].idx-1)
    }else{
        turn = name.length-1
    }
    return answer+turn;
}

function changeCharCount (char){
    let charCode = char.charCodeAt()
    let start = 'A'.charCodeAt()
    const end = 'Z'.charCodeAt()
    return Math.min(end-charCode+1,charCode-start)
}

만약 오른쪽에서 > 했을 때 맨 앞으로 오게 된다면.... 다시 깊은 고민을 해야 될것같다.
다행히?도 이번 문제는 그렇지 않아서 해결할 수 있었다. 😅

profile
Kyle 발전기

4개의 댓글

comment-user-thumbnail
2021년 2월 26일

안녕하세요! 풀이 잘 봤습니다 :)
풀이 참고하는 중에 질문이 있어서 댓글남깁니다!

if(aList.length && aList[0].idx<=aList[0].cnt)
여기서 aList.length 까지 조건에 포함시키신 이유를 알 수 있을까요?

1개의 답글