[오늘부터 알고리즘] #1-2 그리디 알고리즘(Greedy Algorithm) - 조이스틱

ma·2026년 5월 8일
post-thumbnail

💻 오늘의 문제

풀이 과정

class Solution {
    public int solution(String name) {
        int answer = 0;
        
        // 좌우 이동 최소값
        int move = name.length() - 1;
        
        for(int i = 0; i < name.length(); i++) {
            char c = name.charAt(i);
            
            // 위/아래 이동 계산
            answer += Math.min(c - 'A', 'Z' - c + 1);
            
            int next = i + 1;
            
            while(next < name.length() && name.charAt(next) == 'A') next++;
            
            // 좌우 이동 최소값 갱신(예: AAAABBA)
            move = Math.min(move, i+name.length() - next + Math.min(i, name.length() - next));
        }
        
        answer += move;
        
        return answer;
    }
}

[핵심코드]

  • 위/아래 조작(알파뱃 조작)

    • Math.min(c-'A', 'Z'-c+1)
      • c - 'A': 위로 이동 (A → B 방향)
      • 'Z' - c + 1: 아래로 이동 (A → Z 방향)
  • while문의 역할: 연속된 A 구간의 끝 위치(next) 찾기

  • 커서 이동 최소화

    move = Math.min(
        move,
        i + name.length() - next + Math.min(i, name.length() - next)
    );
    • name.length() - next 뒤쪽 남은 거리
    • Math.min(i, name.length() - next) 방향 전환 비용 최소 선택
profile
내가 공부하기 위해

0개의 댓글