반응형
12-24 00:25
Today
Total
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
관리 메뉴

개발하는 고라니

[Programmers] 조이스틱 본문

Programming/프로그래머스

[Programmers] 조이스틱

조용한고라니 2021. 5. 29. 19:00
반응형
 

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

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

programmers.co.kr


나의 문제 접근법

  1. 주어진 문자열을 문자 배열로 변환하고, 각 문자로의 이동 회수를 구했다.
    1. 예를 들어 "JAN"이라는 문자열이 주어지면 첫번째 'A'에서 'J'로 갈 수 있는 이동횟수는 오른쪽으로 이동했을 때 9회, 왼쪽으로 이동했을 때 16회인데, 이 둘 중 최소값인 9를 택한다.
    2. 마찬가지로 두번째 문자에 대해서도 동일한 방법으로 이동회수를 구한다.
  2. 현재 문자에서 왼쪽과 오른쪽으로 탐색을 하는데, 이 때 'A'가 아닌 문자가 있는 곳을 찾는다.
    1. 예를 들어 "JAN"이 입력일 때, 현재 'J'에 있다면 우측에 2번 더 가야 'A'가 아닌 문자 'N'이 있고, 좌측으로 1번 가면 'A'가 아닌 문자 'N'이 있다.
    2. 여기서 좌측으로 1번만 가면 'A'가 아닌 문자가 있기 때문에 좌측으로 가는 것을 택한다.

# Code </>

class Solution {

    static class Data{
        int idx, cnt;

        public Data(int idx, int cnt) {
            this.idx = idx;
            this.cnt = cnt;
        }
    }
    static int n;
    static char[] str = new char[20];

    static int up(char target){
        return target - 'A';
    }
    static int down(char target){
        return 'Z' - target + 1;
    }

    static Data getLeft(int cur){

        int idx = cur;
        int cnt = 0;

        while(true){
            idx--;
            cnt++;
            if(idx < 0) idx = n;
            if(str[idx] != 'A') return new Data(idx, cnt);
            if(idx == cur) break;
        }
        return null;
    }
    static Data getRight(int cur){

        int idx = cur;
        int cnt = 0;

        while(true){
            idx++;
            cnt++;
            if(idx > n) idx = 0;
            if(str[idx] != 'A') return new Data(idx, cnt);
            if(idx == cur) break;
        }
        return null;
    }

    public int solution(String name) {
        n = name.length() - 1;
        str = name.toCharArray();

        int move = 0;
        int cur = 0;

        for(int i=0; i<=n; i++)
            move += Math.min(up(str[i]), down(str[i]));

        str[0] = 'A';
        for(int i=0; i<=n; i++){
            Data left = getLeft(cur);
            Data right = getRight(cur);
            int min = 9999999;
            int idx = -1;

            if(left != null){
                min = Math.min(min, left.cnt);
                idx = left.idx;
            }
            if(right != null){
                min = Math.min(min, right.cnt);
                idx = right.idx;
            }
            if(idx != -1) {
                cur = idx;
                move += min;
                str[cur] = 'A';
            }
        }

        return move;
    }
}
반응형

'Programming > 프로그래머스' 카테고리의 다른 글

[Programmers] 단어 변환  (0) 2021.10.03
[Programmers] 여행경로  (0) 2021.10.03
[Programmers] 소수 찾기  (0) 2021.05.26
[Programmers] 게임 맵 최단거리  (0) 2021.05.26
[Programmers] 리틀 프렌즈 사천성  (0) 2021.05.17
Comments