Algorithms/Java

99클럽 코테 스터디 19일차 TIL + 조이스틱 (java)

Jenn28 2024. 8. 9. 16:24

 

💡 문제

권장 시간

  • 1시간 30분

소요 시간

  • 1시간 50분 + a

나의 풀이 코드

import java.util.*;

class Solution {
    public int solution(String name) {
        int answer = 0;

        int move = name.length() - 1;
        
        for (int i = 0; i < name.length(); i++) {
            // [상하이동]
            // 문자가 'C'면 'C'-'A' = 2가 됨 -> 두 번의 이동이 있다는 의미
            // 문자가 'B'면 'Z'-'B'+1 = 25가 됨 -> 반시계 방향으로 25번의 이동이 있다는 의미
	        answer += Math.min(name.charAt(i) - 'A', 'Z' - name.charAt(i) + 1);
            
            // 연속된 'A'가 끝나는 지점 찾기
            int next = i + 1;
            while (next < name.length() && name.charAt(next) == 'A') {
                next++;
            }
            
            // [좌우이동]
            // 오른쪽으로 가다가 A 만나면 왼쪽으로 이동
            // 이동횟수 = (A 만나기 전까지의 오른쪽 이동횟수) + (왼쪽 이동횟수)
            move = Math.min(move, (i * 2) + name.length() - next); // 왼쪽으로 갔다가 오른쪽으로 감
            move = Math.min(move, (name.length() - next) * 2 + i); // 오른쪽 갔다가 돌아옴
        }
        
        return answer += move;
    }
}

다른 사람 코드

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);
            int pA = i + 1;
            while (pA < len && name.charAt(pA) == 'A') {
                pA++;
            }
            move = Math.min(move, i * 2 + len - pA);
            move = Math.min(move, (len - pA) * 2 + i);
        }
        return answer + move;
    }
}

주요사항

어려워서 못푼 문제.

다른 사람 풀이를 찾아봤는데도 이해가 안돼서 가장 이해가 잘 된 그림을 가지고 왔다.

Ref.

[JAVA] 프로그래머스 조이스틱