11-04 14:21
- Today
 
- Total
 
													Link
													
												
											
												
												
											
									개발하는 고라니
[Programmers] 조이스틱 본문
반응형
    
    
    
  코딩테스트 연습 - 조이스틱
조이스틱으로 알파벳 이름을 완성하세요. 맨 처음엔 A로만 이루어져 있습니다. ex) 완성해야 하는 이름이 세 글자면 AAA, 네 글자면 AAAA 조이스틱을 각 방향으로 움직이면 아래와 같습니다. ▲ - 다
programmers.co.kr
나의 문제 접근법
- 주어진 문자열을 문자 배열로 변환하고, 각 문자로의 이동 회수를 구했다.
- 예를 들어 "JAN"이라는 문자열이 주어지면 첫번째 'A'에서 'J'로 갈 수 있는 이동횟수는 오른쪽으로 이동했을 때 9회, 왼쪽으로 이동했을 때 16회인데, 이 둘 중 최소값인 9를 택한다.
 - 마찬가지로 두번째 문자에 대해서도 동일한 방법으로 이동회수를 구한다.
 
 - 현재 문자에서 왼쪽과 오른쪽으로 탐색을 하는데, 이 때 'A'가 아닌 문자가 있는 곳을 찾는다.
- 예를 들어 "JAN"이 입력일 때, 현재 'J'에 있다면 우측에 2번 더 가야 'A'가 아닌 문자 'N'이 있고, 좌측으로 1번 가면 'A'가 아닌 문자 'N'이 있다.
 - 여기서 좌측으로 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