[프로그래머스] 코딩테스트 연습 - 탐욕법(Greedy) Level 2 조이스틱

uoahy·2021년 9월 15일
0

Solution.java

class Solution {
    public int solution(String name) {
        int answer = 0;
        
        int notA = 0;
        
        for (int i = 0; i < name.length(); i++) {
            if (name.charAt(i) != 'A') {
                answer += Math.min(name.charAt(i) - 'A', 'Z' - name.charAt(i) + 1);
                notA++;
            }
        }
        
        boolean[] visited = new boolean[name.length()];
        
        if (name.charAt(0) != 'A') {
            visited[0] = true;
            notA--;
        }
        
        int i = 0;
        int d = 1;
        
        while (notA > 0) {            
            if (!visited[(i + d) % name.length()] && name.charAt((i + d) % name.length()) != 'A') {
                answer += d;
                i = (i + d) % name.length();
                visited[i] = true;
                d = 1;
                notA--;
                continue;
            }
            if (!visited[i >= d ? i - d : name.length() - (d - i)] && name.charAt(i >= d ? i - d : name.length() - (d - i)) != 'A') {
                answer += d;
                i = i >= d ? i - d : name.length() - (d - i);
                visited[i] = true;
                d = 1;
                notA--;
                continue;
            }
            
            d++;
        }
        
        return answer;
    }
}

제출하니 마지막 테스트 케이스 하나만 틀렸다고 떴는데 원인을 모르겠다.

다음에 다시 도전해봐야겠다.


처음엔 왼쪽이나 오른쪽 한방향으로만 쭉 가는걸 생각했는데

갔다가 돌아오는게 더 빠른 경우도 있다는걸 알게되었다.

예외상황을 꼼꼼히 체크해봐야겠다는 생각이 한 번 더 든 순간이었다.

코드가 뭔가 지저분한데 다음에 기회가 된다면 다듬어봐야겠다.

출처: 프로그래머스 코딩 테스트 연습, https://programmers.co.kr/learn/challenges

0개의 댓글