Coding Test/Programmers

[프로그래머스] 조이스틱 (java)

Heang Lee 2021. 5. 11. 13:30

코딩테스트 연습 - 조이스틱 | 프로그래머스 (programmers.co.kr)

 

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

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

programmers.co.kr

어떻게 생각하고 문제를 풀었는가?

좌/우 방향을 결정하는 요소는 '어디서 다음 상/하 버튼을 눌러야하는가?'입니다.

만약 다음 위치까지 좌측버튼을 누르는 횟수가 우측 버튼을 눌러야 하는 횟수보다 작다면 좌측버튼을 눌러 이동하여야 합니다.

이동한 후에도 탐색방향을 결정해야 하는데, 이는 탐색해야할 문자의 수를 통해 결정할 수 있습니다.

전체적으로 누르게 될 상/하 버튼은 입력 받은 문자열에 의해서만 결정됩니다.

따라서 상/하 버튼과 좌/우 버튼을 별개의 반복문으로 작성할 수 있습니다.

 

코드

class Solution {
    public int solution(String name) {       
        int upDown=0, len=name.length();
        for(int charAt : name.toCharArray()){  //상-하 이동은 좌-우 이동에 상관없이 저장된다.
            upDown += (charAt> 78)? 91-charAt: charAt-65;
        }
        int leftRight = len-1;
        for(int i=0;i<len;i++){
            int next=i+1;
            while(next<len && name.charAt(next)=='A') next++;
            //i+len-next : 좌측으로 갔을때 상-하 버튼을 눌러야하는 위치까지 이동하는 거리
            //min(i,len-next) : 다음 상-하 버튼위치에서 좌측버튼을 눌러 위치i까지 탐색하는 횟수와 우측버튼을 눌러 탐색하는 횟수를 비교
            leftRight = Math.min(leftRight,i+len-next +Math.min(i,len-next));
        }
        return upDown+leftRight;
    }
}

생각한 내용을 바탕으로 코드를 작성하였습니다.

우측 버튼만 누르는 것을 디폴트 값으로 설정한 후 현재 위치에서 좌측으로 이동한 경우 눌러야 하는 좌/우 버튼의 수와 비교하여 최소값을 좌/우 버튼의 최소값을 계산합니다.