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

nocarrotrabbit·2022년 7월 6일
0

문제:
조이스틱으로 알파벳 이름을 완성하세요.

조이스틱 룰
▲ - 다음 알파벳
▼ - 이전 알파벳 (A에서 아래쪽으로 이동하면 Z로)
◀ - 커서를 왼쪽으로 이동 (첫 번째 위치에서 왼쪽으로 이동하면 마지막 문자에 커서)
▶ - 커서를 오른쪽으로 이동 (마지막 위치에서 오른쪽으로 이동하면 첫 번째 문자에 커서)

만들고자 하는 이름 name이 매개변수로 주어질 때, 이름에 대해 조이스틱 조작 횟수의 최솟값을 return

문제해결 방향

1. 알파벳조작:

중간값인 13으로 인덱스 비교

  • 자바는 charAt() 메소드로 아스키코드를 이용해 알파벳간의 비교가 가능
  • python도 ord() / char() 메소드를 사용하면 가능

2. 이동 조작:

조작횟수의 최솟값이므로 Math.min()을 사용
이동방법 경우의수:

    1. 걍 오른쪽으로 쭉쭉: 전체길이 -1
    1. 왼쪽으로 함 돌아갔다가 끝으로 가서 왼쪽으로 쭉:
      i*2 + 전체-연속되는 A끝나는지점
    1. 시작하자마자 왼쪽으로가서 A나올때까지 갔다가 돌아나와서 처음으로 간후 다시 A연속이 시작되는 지점까지 가기:
      i + 전체-연속끝지점 *2

#min 비교 주의점:
python은 여러개비교가가능하지만 자바는 두개씩만 비교

class Solution {
    public int solution(String name) {
        int answer = 0;
        int length = name.length();
        int move = length - 1;
        int index = 0;
        
        for (int i = 0; i < name.length(); i++){
            answer += Math.min(name.charAt(i)-'A','Z'-name.charAt(i) +1);
            
            index = i + 1;
            while (index < length && name.charAt(index) == 'A'){
                index++;
            }
            
            move = Math.min(move, i*2 + length -index);
            move = Math.min(move, i + (length-index)*2); 
        }
        return answer + move;
    }
}
def solution(name):
    answer = 0   
    alp = list("ABCDEFGHIJKLMNOPQRSTUVWXYZ")
        
    move = len(name) -1
    length = len(name)
    
    for i,char in enumerate(name):
        if alp.index(char)<=13:
            answer +=  alp.index(char)
        else:
            answer += (26 - alp.index(char)) 
    
        index = i+1
        while index <length and name[index] == "A":
            index += 1            
        move = min(move, i*2 + length - index, (length - index)*2 + i  )
            
            
    
        
    return answer + move

0개의 댓글