카테고리 없음

조이스틱 - 탐욕

JUNGKEUNG 2024. 8. 9. 00:39
반응형

 

주어진 이름을 조이스틱으로 완성할 때, 최소환의 조작 횟수를 구하는 문제이다. 이름을 완성하기 위해 필요한 최소한의 조작 횟수를 계산해야한다.

 

 

문제분석

각 문자를 'A'에서 목표 문자로 변경하기 위해 필요한 상/하 방향 조작 횟수를 계산한다.

 - 'A'에서 목표 문자를 만드는 두 가지 : 위로 이동 하거나 아래로 이동 

 - 예를 들어 'A에서 'B;로 변경하려면 위로 한번, 'A' 에서 'Z'로 변경하려면 아래로 한 번이다.

 

커서 이동 : 커서를 좌우로 움직여 각 문자를 완성 한다.

 - 왼쪽이나 오른쪽으로 이동할 때, 효율적인 경로를 선택해야한다. 모든 위치를 순차적으로 방문하는 것이 아닌, 'A'가 아닌 문자의 위치로 빠르게 이동해야한다.

 

class Solution {
    public int solution(String name) {
        int n = name.length();
        int answer = 0;
        int minMove = n - 1; // 기본적으로 모든 문자를 방문하는 경우의 커서 이동

        for (int i = 0; i < n; i++) {
            // 알파벳 변경 횟수
            char currentChar = name.charAt(i);
            int changeCount = Math.min(currentChar - 'A', 'Z' - currentChar + 1);
            answer += changeCount;

            // 커서 이동 최소값 계산
            int nextIndex = i + 1;
            while (nextIndex < n && name.charAt(nextIndex) == 'A') {
                nextIndex++;
            }

            // 현재 위치에서 이동해야 하는 경우와 뒤로 돌아서 이동하는 경우 중 최소값 선택
            int move = i + n - nextIndex + Math.min(i, n - nextIndex);
            minMove = Math.min(minMove, move);
        }

        answer += minMove;
        return answer;
    }
}

 

문자열의 각 위치에서 알파벳 변경과 커서 이동을 고려하여 문제에서 요구하는 최소 조작 횟수를 계산을 해야한다.

 

 

 

Script

이 문제에서 위 , 아래 그리고 좌, 우 로 이동이 가능할때 최소 조건으로 답을 구하는 문제이다. 그렇다면 우리가 생각해야하는건 현재 위치에서 이동할때 와 뒤로 돌아서 이동하는 경우 총 2가지를 생각하여 답을 구하는것이 가장 좋다. 

쉽게 생각하면 1 ~ 10 이 있으면 5라는 숫자에 도달하려면 앞으로 4번 이동하거나 뒤로 6번 이동해야한다. 이중 가장 적게 조작하여 도달할수 있는건 4번 이다. 이런 형식으로 생각하여 문제를 풀면 간단하다