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

woolee의 기록보관소·2022년 12월 21일
0

알고리즘 문제풀이

목록 보기
127/178

문제 출처

프로그래머스 lev2 - 조이스틱

나의 풀이

알파벳을 변경하는 부분은 쉬웠지만,
커서 이동에서 모든 index에서 A를 고려해 좌우 최소값을 찾으려다 보니 코드가 너무 복잡해졌다.

다른 풀이

위아래 알파벳 변경 최소값과 좌우 커서 이동의 최소값을 따로 구해서 마지막에 더해준다.

위아래 알파벳 변경 부분은 단순하게 아스키코드를 사용하면 된다.
좌우 커서 이동의 가장 일반적인 값은 매번 오른쪽으로 한번씩 움직이는 것이다. 그러면 moveCursor의 초기값이 len-1이 된다.

i+1을 idx 변수에 저장하고,
A를 만날 때까지의 idx 값을 찾는다.

그리고 i에서 좌우 커서 이동의 최소값을 판단해야 하는데 길이로 판단한다.

문자 A가 있는 구간의 길이가 (len-idx)이다.

문자 A가 있는 부분을 되돌아가면 (len-idx)*2 + i
지금까지 온 구간을 되돌아가면 i*2 + (len+idx)
초기값 moveCursor

이 3개의 값을 비교해서 최소값을 찾는다.

function solution(name) {
  let changeStr = 0
  let len = name.length
  let moveCursor = len - 1
  
  for (let i = 0; i < len; i++) {
    let ascii = name.charCodeAt(i)
    
    // 위/아래 알파벳 변경
    if (ascii < 78) changeStr += ascii - 65
    else changeStr += 91 - ascii

    // 좌우 커서 이동 
    let idx = i + 1
    while (idx < len && name[idx] == 'A') idx++    
    moveCursor = Math.min(moveCursor, i*2 + (len - idx), (len - idx)*2 + i)
  }

  return changeStr + moveCursor
}

// console.log(solution("AAABBAAAAAAAAAAAAAAAABABAA"))
// console.log(solution("JAZ"))
console.log(solution("JEROEN"))
// console.log(solution("JAN"))

동일한 풀이 아이디어

function solution(name) {
  let sum = 0;
  for (let i = 0; i < name.length; i++) {
    let diff = name[i].charCodeAt() - 'A'.charCodeAt();
    sum += diff > 13 ? 26 - diff : diff;
  }

  let minMove = name.length - 1;
  for (let i = 1; i < name.length; i++) {
    if (name[i] === 'A') {
      for (var j = i + 1; j < name.length; j++) {
        if (name[j] !== 'A') {
          break;
        }
      }

      const left = i - 1;
      const right = name.length - j;
      minMove = Math.min(minMove, left > right ? left + right * 2 : left * 2 + right);

      i = j;
    }
  }

  return sum + minMove;
}
profile
https://medium.com/@wooleejaan

0개의 댓글