[Lv2] 조이스틱

이말감·2022년 7월 24일
0

Programmers

목록 보기
14/32
post-thumbnail

프로그래머스 Lv2 조이스틱

문제

링크

풀이

def solution(name):
    answer = 0
    move = len(name) - 1
    # 1
    for n in name :
        answer += min(ord('Z') - ord(n) + 1, ord(n)-ord('A'))
    # 2
    if 'A' in name :
        # 3
        for i, n in enumerate(name) :
            idx = i + 1
            while idx < len(name) and name[idx] == 'A' :
                idx += 1
            move = min(move, i * 2 + len(name) - idx, i + (len(name) - idx) * 2)     
    # 4
    return answer + move

답을 도출하는 순서는 다음과 같다.

  1. 먼저 모든 문자의 아스키 코드를 이용해 다음 알파벳으로 이동하는 횟수 구하기
    1.1. 'A' 부터 시작했을 때, 아니면 뒤로 돌아가서 'Z'에서 시작했을 때 이동 횟수를 각각 구하고 그 중 작은 수를 answer에 더한다.
  2. name에 'A'가 없다면 처음부터 오른쪽 방향으로 쭉 가면 되므로 len(name) - 1 더하고 출력하기(끝)
  3. name에 'A'가 있을 경우, 한 문자씩 보기
    3.1. 바로 다음 문자가 'A'일 경우 연속되는 'A'의 끝을 구하고, 구한 끝을 이용해서 오른쪽으로 갈지, 왼쪽으로 갈지 구하기
  4. 움직임(move) 값과 answer값을 더해서 출력하기 (끝)

여기서 3번을 만드는 부분이 어려웠기 때문에 결국 다른 분의 풀이 방법을 참고해서 풀었다.

name에 'A'가 없으면 그냥 시작부터 오른쪽으로 쭉 가면 된다.
'A'가 없을 경우, 이동하는 방법은 3가지다.

  1. 시작부터 오른쪽으로 쭉 가기.(len(name) - 1)

  2. 시작에서 'A'까지 오른쪽으로 갔다가 다시 돌아와서 왼쪽으로 가기

  3. 시작에서 왼쪽으로 'A'까지 갔다가 다시 돌아와서 오른쪽으로 가기

이 세 가지 방법을 모두 구하고, 그 중에서 가장 작은 값을 더해주면 된다.

자바스크립트도 위와 같은 방법으로 코드를 작성할 수 있었다.

function solution(name) {
    let answer = 0;
    let move = name.length - 1;
    for (let i = 0; i < name.length; i++) {
        answer += Math.min(name[i].charCodeAt(0) - 'A'.charCodeAt(0), 'Z'.charCodeAt(0) - name[i].charCodeAt(0) + 1);
        let idx = i + 1;
        while (idx < name.length && name[idx] === 'A') {
            idx++;
        }
        move = Math.min(move, i*2 + name.length - idx, i + (name.length - idx) * 2)
    }
    return answer + move;
}
profile
전 척척학사지만 말하는 감자에요

0개의 댓글