[Algorithm] 프로그래머스_조이스틱

lnnae·2020년 4월 11일
0

Algorithm

목록 보기
5/40

문제

알파벳 name을 입력받고, A를 시작으로 조이스틱을 조종해 name과 똑같은 문자열을 만들어야합니다. 이때 조이스틱의 조작 횟수의 최솟값을 리턴하면 되는 문제입니다.

풀이

  1. 좌 <-> 우 이동 최소 횟수 카운트
    다음번 A가 나올때까지의 이동 횟수를 셉니다. 인덱스가 마지막으로 돌아가서 이동 횟수를 세는 경우(우->좌)는 전체 길이 - 이동 횟수를 해주니 구할 수 있었습니다.
  2. 상 <-> 하 이동 최소 횟수 카운트
    알파벳 순서의 정가운데인 M을 기준으로 그것보다 작으면 'Z'- 현재 알파벳, 아니면 현재 - 'A'로 이동횟수를 계산합니다.
    char형이기 때문에 이런 연산이 가능합니다. char형은 문자를 저장하는 것 같아도 실제로는 유니코드가 저장되기 때문입니다!
  3. 1과 2를 더하고 return!

2는 어렵지 않았습니다.
그러나...
1이 조금 까다롭게 느껴진 문제입니다.

소스 코드

class Solution {
        public static int solution(String name) {
        int answer = 0;
            
        int minMove = name.length()-1;
        for(int i=0; i<name.length(); i++) {
            if(name.charAt(i) != 'A'){
                int next = i+1;
                while (next < name.length() && name.charAt(next) == 'A') {
                    next++;
                }
                int move = i+ name.length() - next + i;

                minMove = Math.min(move, minMove);
            }
        }
            
        for(int i=0; i<name.length(); i++) {
            if(name.charAt(i) != 'A') {
                if( name.charAt(i) >= 'M' ) {
                    answer += ('Z' - name.charAt(i) + 1);
                } else {
                    answer += ( name.charAt(i) - 'A');
                }
            }
        }

        return minMove + answer;
    }
}

후기

테스트 케이스 8, 10번이 통과하지 못한 상태의 코드입니다.
제가 생각했을때 'AAAAA'처럼 어느쪽으로도 이동하지 않아도 되는 경우에 실패하는 것 같은데
혹시 해결책을 아시는 분은 댓글 남겨주시면 감사하겠습니다..🤔

++ 글을 작성할 때 오른쪽에 마크다운 미리보기(?)를 볼 수 있게 바뀌었네요
마크다운 초보는 만족합니다 긋긋👍

profile
이내임니당 :>

0개의 댓글