본문 바로가기

Programmers/Level2

조이스틱

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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) {
            // 알파벳 최소 거리 구하기
            answer += Math.min(name.charAt(i) - 'A''Z' - name.charAt(i) + 1);
            
            // A가 아닌 부분까지의 거리 체크
            int next = i + 1;
            while (next < len && name.charAt(next) == 'A') {
                next++;
            }
            // 현재 거리 + 남은 거리 + 되돌아가는 거리의 최솟값 갱신
            move = Math.min(move, i + len - next + Math.min(i, len - next));
        }
        // 움직인 거리 계산
        answer += move;
        return answer;
    }
}
cs

A가 연속되어 있을 때, 다시 돌아가는 경우를 체크하는 부분이 어려웠다.

우선 알파벳을 변경시키는 움직임과, 커서를 이동하는 움직임을 분리해서 계산하였다.

A가 연속되어 있을 경우 앞쪽으로 갔다가 되돌아오는 경우, 뒷쪽으로 갔다가 되돌아오는 경우를 Math.min(i, len - next)으로 구하였다.

i는 현재 위치까지의 거리이고, len - next는 남아있는 문자의 갯수이다.

현재 위치까지 오는 거리와 남아있는 문자까지의 거리를 합한 값은 무조건 더해주어야 한다.여기서 앞쪽으로 가는 거리가 짧은 경우에는 i < len - next 일 것이며, 뒷쪽으로 가는 거리가 짧은 경우에는 i > len - next 일 것이다.이 중 짧은 쪽으로 가는 것으로 하여 갱신하고, 최종적으로 움직인 거리를 계산하여 더해준다.

 

참고 사이트 : https://mishuni.tistory.com/36

'Programmers > Level2' 카테고리의 다른 글

H-Index  (0) 2021.07.22
카펫  (0) 2021.07.22
프린터  (0) 2021.07.21
큰 수 만들기  (0) 2021.07.21
짝지어 제거하기  (0) 2021.07.20