Dev/Programmers

[프로그래머스] 조이스틱 (Java)

마이캣호두 2024. 12. 30. 11:22
반응형

https://school.programmers.co.kr/learn/courses/30/lessons/42860

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

 

Review

처음에는 list에 넣어서 풀었는데 좌우 이동을 계산하는 데 불편함을 느껴서 아래와 같은 코드로 수정했다. 아래-위 방식은 풀기 쉬웠는데, 좌-우 방식이 좀 까다로웠다.

 

우선 크게 분류하면, 아래-위 이동과 좌-우 이동으로 코드를 나누어 계산한 후 더해주는 방식이다. minMoves를 초기화해준 뒤 i를 기준으로 좌로 이동하는 횟수와 우로 이동하는 횟수 중 작은 것을 선택해 답에 더해주면 된다.

가장 하단의 코드는 name이 모두 A로만 구성되어 있는 경우 답이 0이 아닌 name.length() - 1로 출력되는 에러를 해결한 것이다. 하드 코딩이 들어간 느낌이어서 이것보다 더 좋은 방법이 있을 수도 있겠지만 우선은 이게 최선인 걸로..

 

 

Code

class Solution {
    public int solution(String name) {
        int answer = 0;
        
        // 아래-위 이동
        for (int i = 0; i < name.length(); i++) {
            answer += Math.min(name.charAt(i) - 'A', 'Z' - name.charAt(i) + 1);
        }
        
        // 좌-우 이동
        int minMoves = name.length() - 1;
        
        for (int i = 0; i < name.length(); i++) {
            if (name.charAt(i) != 'A') {
                int nextNotA = i + 1;

                while (nextNotA < name.length() && name.charAt(nextNotA) == 'A') {
                    nextNotA++;
                }
                
                minMoves = Math.min(minMoves, Math.min(i, name.length() - nextNotA) + i + name.length() - nextNotA);
            }
        }
        
        answer += minMoves;
        
        // test case 17 오류로 인해 추가한 코드
        // AAAAAA인 경우 0이 아닌 5로 출력되는 에러 해결
        int count = 0;
        
        for (int i = 0; i < name.length(); i++) {
            if (name.charAt(i) == 'A') {
                count++;
            }
        }
        
        if (count == name.length()) {
            answer = 0;
        }
        
        return answer;
    }
}

 
 

반응형