알고리즘/프로그래머스 Level2

[프로그래머스, Java] Level2:조이스틱

류창 2021. 11. 20. 18:34
반응형

 

문제분석

 

조이스틱을 움직여서, 목표단어를 만드는데 움직이는 최소 횟수를 구하는 문제입니다.

 

이 문제를 풀기위해선 2개의 기능을 구현하셔야합니다.

 

1. 조이스틱을 위, 아래로 움직여서 문자를 바꾸고 횟수를 반환하는 메소드

 

2. 조이스틱을 오른쪽,왼쪽중 가장 짧은길을 골라 이동하는 횟수를 반환하는 기능

 

 

1번+2번을 하시면 우리가 원하는 답이 나올겁니다.

 

 

초기 문자열은  문자열 길이만큼 A가 부여되고시작됩니다.

 

1번을 구현하기위해선   Min('문자'-'A' ,26-'문자'-'A') 하셔도됩니다.

(26은 모든 영어문자갯수)

또는, 영어문자의 중간부분의 문자 'M'을 기준으로 연산을해도됩니다. 어찌댓든,

해당 문자를 만드는 최소한의 이동을 반환하면 됩니다.

 

2번을 구현하기위해선,   <<왼쪽 이동과 오른쪽이동>> 중 어느쪽이 

최소거리로 이동하는지를 확인해야합니다.

 

왼쪽이동과 오른쪽이동중 최소값을 구하는 로직은,

Min( i(오른쪽이동), len-next(왼쪽이동))를 구하고, i+(len-next)를 한번더 더해주면됩니다.

문제풀이

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
class Solution {
    public int solution(String name) {
        int answer = 0;
 
        int len = name.length();
        int min_move = len-1; 
        // 처음부터 끝까지 오른쪽으로 갈 때의 이동횟수
 
        for(int i=0; i<len; ++i) {
            // 1. 상하: A로 가는 가까운 길
            // a ... l  'm'  n ... z
            if(name.charAt(i)<='M') {
                answer += name.charAt(i)-'A';
            }
            else {
                answer +='Z'-name.charAt(i)+1;
            }
 
            // 2. 좌우: 연속된 A의 등장에 따라 달라지는 최소 움직임
            int next = i+1;
            while(next<len && name.charAt(next)=='A') {
                next++;
            }
            min_move = Math.min(min_move,i+len-next+Math.min(i,len-next));
 
 
        }
        answer += min_move;
 
 
        return answer;
    }
}
cs
반응형