Coding Test/Programmers
[프로그래머스] 조이스틱 (java)
Heang Lee
2021. 5. 11. 13:30
코딩테스트 연습 - 조이스틱 | 프로그래머스 (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;
}
}
생각한 내용을 바탕으로 코드를 작성하였습니다.
우측 버튼만 누르는 것을 디폴트 값으로 설정한 후 현재 위치에서 좌측으로 이동한 경우 눌러야 하는 좌/우 버튼의 수와 비교하여 최소값을 좌/우 버튼의 최소값을 계산합니다.