Algorithm & Data Structure/프로그래머스

[Java] 프로그래머스 Lv.2 > 조이스틱

ygreenb 2022. 3. 6. 17:22

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

 

코딩테스트 연습 - 조이스틱

조이스틱으로 알파벳 이름을 완성하세요. 맨 처음엔 A로만 이루어져 있습니다. ex) 완성해야 하는 이름이 세 글자면 AAA, 네 글자면 AAAA 조이스틱을 각 방향으로 움직이면 아래와 같습니다. ▲ - 다

programmers.co.kr

풀이

조이스틱의 이동횟수만 구하면되기 때문에, 상하와 좌우 이동을 따로 계산한다.

상하이동은 A-Z의 알파벳이 총 26개로 이루어져있기 때문에 중간알파벳인 N을 기준으로 이동횟수를 더해주면 되었다.

N보다 작으면 A를 빼주고 N보다 크다면 Z에서 빼준뒤 1을 더해 계산한다.

좌우이동은 2가지를 고려해야한다.

  1. 계속 오른쪽으로 이동 : 이동횟수 = (문자열의 길이) - 1
  2. 오른쪽으로 가다가 A를 만날경우 왼쪽으로 이동 : 이동횟수 = (A만나기 전 오른쪽 이동횟수) + (왼쪽 이동횟수)

이 2가지 이동횟수를 비교해서 더 작은 쪽으로 이동한다.

주의할 점은 마지막까지 A만 있을 경우인데, 이 경우에는 다시왼쪽으로 돌아갈 필요가 없다는 점을 유의하자!

class Solution {
    public int solution(String name) {
        int answer=0;
        int len = name.length();
        int move = len-1; // 좌우이동횟수
        
        for(int i=0; i<len;i++){
            // 상하이동
            if(name.charAt(i)<'N'){
                answer += name.charAt(i)-'A';
            }else{
                answer += 'Z' - name.charAt(i)+1;
            }
            
            // A의 마지막 위치구함
            int conA = i+1;
            while(conA <len && name.charAt(conA) =='A'){
                conA++;
            }
			// 좌우이동
            move = Math.min(move, i+(len-conA)+Math.min(i,len-conA));
        }
        
        return answer+move;
    }
}