본문 바로가기

알고리즘/다시 봐야할 것들

프로그래머스 - 조이스틱 (실패 못풀었습니다)

문제출처

 

 

코딩테스트 연습 - 조이스틱

조이스틱으로 알파벳 이름을 완성하세요. 맨 처음엔 A로만 이루어져 있습니다. ex) 완성해야 하는 이름이 세 글자면 AAA, 네 글자면 AAAA 조이스틱을 각 방향으로 움직이면 아래와 같습니다. ▲ - 다

programmers.co.kr

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

        for (int i = 0; i < name.length(); i++) {
            // 14번째 알파벳부터는 반대로 가야함.
            if (13 < name.charAt(i)-64) {
                joyMoveForAlp += 26 - (name.charAt(i) - 'A');
            } else {
                joyMoveForAlp += name.charAt(i) - 'A';
            }
            if (name.charAt(i) != 'A') {
                numOfNotA++;
            }
        }
        if (numOfNotA == name.length()) return joyMoveForAlp+=name.length()-1;

        // 앞으로 가는 방법.
        int numOfForwardMove = joyMoveForAlp;
        int temp = numOfNotA;
        for (int i = 0; i < name.length(); i++) {
            numOfForwardMove++;
            if (name.charAt(i) != 'A') {
                temp--;
            }
            if (temp==0) {
                break;
            }
        }
        numOfForwardMove--; //0은 움직인 걸로 안쳐서 --해줘야함.

        // 뒤로 가는 방법.
        int numOfBackwardMove = joyMoveForAlp;
        temp = numOfNotA;
        if (name.charAt(0) != 'A') temp--;
        for (int i = name.length() - 1; i > 0; i--) {
            numOfBackwardMove++;
            if (name.charAt(i) != 'A') {
                temp--;
            }
            if (temp == 0) {
                break;
            }
        }

        return Math.min(numOfForwardMove, numOfBackwardMove);
    }
}

테스트케이스 마지막에서 통과를 못한다.

도저히 모르겠어서 검색해봤는데, 앞에서 뒤로 가는 경우, 뒤에서 앞으로 가는 경우가 있는데 나는 이 두가지만 처리해줬다.

근데 마지막 케이스로 앞에서 뒤로 가다가 다시 뒤에서 앞으로 가는 경우. 역주행하는 경우가 있었다.

솔직히 중간중간 풀면서 무지성으로 풀어서 어차피 맘에 안드는 코드긴 했는데, 결과적으로 풀지도 못하고, 예외 케이스도 생각 못한 망한 케이스가 됐다. 

다음에 다시 풀어봐야겠다. 애초에 그리드 카테고리 문제를 전혀 안풀어서 그런지, 너무 약한 느낌이 든다. 그리드도 가끔 몇개씩 풀어봐야겠다.

 

728x90
반응형