잡다한 배똥월드

728x90
코딩 테스트 풀이 체크리스트
2시간 내에 풀었는가? X
본인의 실력으로 풀었는가? O

 

 

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

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

programmers.co.kr

 

 

 

 

 

class Solution {
    String word = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; //알파벳 위치 찾기 위해서
    int answer = Integer.MAX_VALUE; //가장 큰 값으로 설정
    String[] names; //name 나눌 용도
    boolean[] check; //다녀왔는지 확인 용도
    public int solution(String name) {
        names = name.split("");
        check = new boolean[names.length];
        int all = 0; 
        
        //names 확인하면서 A는 굳이 들를 필요 없으니까 미리 check에 true 표시하고,
        //바꿔야할 알파벳들 개수 구하기
        for (int i = 0; i < names.length; i++) {
            if (names[i].equals("A")) check[i] = true;
            if (!names[i].equals("A")) all++;
        }
        
        //함수 호출
        func(all, 0, 0);
        
        return answer;
    }
    
    public void func(int num, int p, int count) {
        if (num == 0) { //다 바꿨으면 answer 값 바꾸기
            answer = Math.min(count, answer);
            return;
        }
        
        int r = right(p); //오른쪽으로 이동했을 경우 바꿀 위치
        int l = left(p); //왼쪽으로 이동했을 경우 바꿀 위치
        
        //오른쪽으로 이동하는 경우의 함수호출
        check[r] = true;
        int rCount = (p <= r) ? r - p : names.length - p + r; //r의 위치까지 이동 수
        int rIndex = word.indexOf(names[r]); //위로 알파벳을 바꿨을 때
        int anotherR = 26 - rIndex; //아래로 알파벳을 바꿨을 때
        func(num-1, r, count + rCount + Math.min(rIndex, anotherR));
        check[r] = false;
        
        //왼쪽으로 이동하는 경우의 함수호출
        check[l] = true;
        int lCount = (p >= l) ? p - l : p + names.length - l; //l의 위치까지 이동 수
        int lIndex = word.indexOf(names[l]); //위로 알파벳을 바꿨을 때
        int anotherL = 26 - lIndex; //아래로 알파벳을 바꿨을 때
        func(num-1, l, count + lCount + Math.min(lIndex, anotherL));
        check[l] = false;
    }
    
    public int right(int p) {
        for (int i = p; i < names.length; i++) {
            if (check[i]) continue;
            return i;
        }
        
        for (int i = 0; i < p; i++) {
            if (check[i]) continue;
            return i;
        }
        return p;
    }
    
    public int left(int p) {
        for (int i = p; i >= 0; i--) {
            if (check[i]) continue;
            return i;
        }
        
        for (int i = names.length - 1; i >= 0; i--) {
            if (check[i]) continue;
            return i;
        }
        return p;
    }
}

 

테스트 1 통과 (0.15ms, 76.1MB)
테스트 2 통과 (0.34ms, 77.6MB)
테스트 3 통과 (0.15ms, 85MB)
테스트 4 통과 (0.54ms, 71.3MB)
테스트 5 통과 (1.18ms, 79.7MB)
테스트 6 통과 (0.32ms, 73.9MB)
테스트 7 통과 (0.58ms, 74.4MB)
테스트 8 통과 (0.13ms, 76.5MB)
테스트 9 통과 (0.31ms, 73MB)
테스트 10 통과 (0.20ms, 74.8MB)
테스트 11 통과 (0.16ms, 73MB)
테스트 12 통과 (0.13ms, 75.3MB)
테스트 13 통과 (0.28ms, 76.6MB)
테스트 14 통과 (0.24ms, 73.3MB)
테스트 15 통과 (0.16ms, 75.7MB)
테스트 16 통과 (0.16ms, 73MB)
테스트 17 통과 (0.12ms, 77MB)
테스트 18 통과 (0.24ms, 71.7MB)
테스트 19 통과 (0.19ms, 80.8MB)
테스트 20 통과 (0.18ms, 73.4MB)
테스트 21 통과 (0.12ms, 73.3MB)
테스트 22 통과 (0.18ms, 72.7MB)
테스트 23 통과 (0.16ms, 71.9MB)
테스트 24 통과 (0.15ms, 84.8MB)
테스트 25 통과 (0.18ms, 79.2MB)
테스트 26 통과 (0.15ms, 73.7MB)
테스트 27 통과 (0.13ms, 75.4MB)

 

 

 

 

 

 

728x90

+ Recent posts