프로그래머스 그리디(조이스틱)

Inhyeeee·2021년 1월 7일
0

코딩 삽질 기록

목록 보기
16/20

문자열을 문자열 배열로

String name = 'avocado';
String[] nameArr = name.split("");

1차 시도

class Solution {
    public int solution(String name) {
        char[] nameArr = name.toCharArray();
        int answer = nameArr.length-1;
        
        for(int i = 0; i < nameArr.length; i++){
            
            if((int)nameArr[1] == 65){
                answer= answer-1;
                
                if((int)nameArr[i] >= 78){
                    answer = answer + 91 - (int)nameArr[i];
                }else if((int)nameArr[i] > 65 && (int)nameArr[i] <= 77){
                    answer = answer + (int)nameArr[i]-65;
                }
            }
            
            if((int)nameArr[1] != 65){
                if((int)nameArr[i] >= 78){
                    answer = answer + 91 - (int)nameArr[i];
                }else if( (int)nameArr[i] > 65 && (int)nameArr[i] <= 77){
                    answer = answer + (int)nameArr[i]-65;
                }
            }
        }
        return answer;
    }
}

결과는 45.5점...ㅎ

2차 시도

class Solution {
    public int solution(String name) {
        char[] nameArr = name.toCharArray();
        int answer = nameArr.length-1;
        
        for(int i = 0; i < nameArr.length; i++){
            if((int)nameArr[i] >= 78){
                    answer = answer + 91 - (int)nameArr[i];
            }else if((int)nameArr[i] > 65 && (int)nameArr[i] <= 77){
                    answer = answer + (int)nameArr[i]-65;
            }else if((int)nameArr[1] == 65){
                answer= answer-1;
            }
            
        }
        return answer;
    }
}

결과는 63.6점....
뭔가 코드가 반복된다...

3차 시도

class Solution {
    public int solution(String name) {
        char[] nameArr = name.toCharArray();
        int answer = nameArr.length - 1;
        
        //가로의 경우
        for(int i = 0; i < nameArr.length; i++){
            if((int)nameArr[i] == 65 && i < 2){
                answer--;
            }
        }
        
        //세로의 경우
        for(int i = 0; i < nameArr.length; i++){
            if((int)nameArr[i] >= 78){
                answer = answer + 91 - (int)nameArr[i];        
            }else if((int)nameArr[i] > 65 && (int)nameArr[i] <= 77){
                answer = answer + (int)nameArr[i] - 65;
            }
        }
        return answer;
    }
}

코드가 반복되는게 비효율적으로 보여서 가로의 경우와 세로 경우로 나눴다.
가로의 경우에는 A가 있냐 없냐가 관건이어서 거기에 맞춰서 다시 짜봤다.
결과는 81.8점.... 또 뭐가 문젠건지...

4차 시도

class Solution {
    public int solution(String name) {
        int answer = 0;
        int demove = name.length() - 1;
        
        for(int i = 0; i < name.length(); i++){
            char c = name.charAt(i);
            answer += ('Z' - c + 1) > c - 'A' ? c - 'A' : ('Z' - c + 1);        
            
            if(c == 'A'){
                int nexti = i+1;
                int cntA = 0;
                while(nexti < name.length() && name.charAt(nexti) == 'A'){
                    cntA ++;
                    nexti ++;
                }
                
                int move = (i-1)*2 + (name.length() - i - 1 - cntA);

                if(demove > move){
                    demove = move;
                }
            }
        }
        answer += demove;
        return answer;
    }
}

결국엔 다른 사람의 풀이를 참고했다.
나와 달랐던 형식은 세로를 계산할 때 3항 연산자로 비교해 준 뒤에 바로 answer에 반영했다는 것.(너무 놀라웠음)

그리고 문제를 풀면서 가장 막혔던 부분이 A가 연속으로 나왔을 때 인건데,
이 분의 풀이에는 일단 특정 문자를 아예 'A'로 잡고, 그다음의 문자가 'A'인지 아닌지를 판별했다.
이렇게 해주면 A가 몇개나 연속하는지 계산이 가능하다는 점이다.

그리고 혼란을 방지하기 위해 새로운 move 변수를 하나 만들어서 기존의 디폴트값(demove)과는 상관없이 무브수를 계산해야 한다. (이 부분도 생각하지 못함)

int move = (i-1)*2 + (name.length() - i - 1 - cntA);

이 식은 내가 풀면서도 짜봤던 식이므로 이해를 할 수 있었다.
i번째에서 'A'가 나왔다면, 0에서 i-1번째는 오른쪽 갔다가 왼쪽으로 가니까 *2를 해준다.
그리고 i-1 이후의 구간은 오른쪽으로만 이동을 하니까 전체 길이에서 i+1까지 빼준다. (i는 'A'니까 상관없음)
그리고 cntA에서 연속하는 A의 개수를 이미 계산을 했으므로 cntA도 빼준다.
(i번째의 A를 제외한 A인 경우)

이제 디폴트 값이랑 move 값을 비교해서 둘 중 더 작은 것으로 교체한다.
이렇게 해주는 이유는 오른쪽으로 갔다가 왼쪽으로 가는게 더 적을 때도 있고, 처음부터 왼쪽으로 가는게 더 적은 경우도 있기에 비교를 해주는 것이다.(이건 정말 생각도 못했다....)

최종적으로 교체된 값이 answer가 되는 것이다.

profile
avocadoxxi

0개의 댓글