프로그래머스 코딩테스트 조이스틱(탐욕법)
오늘은 프로그래머스 코딩테스트 연습에 있는 조이스틱 문제에 대하여 풀어보았다.
문제 풀어보기
조이스틱의 위아래로 움직여 알파벳을 찾는 것까지는 구현을 하였다. 하지만 좌우로 움직여 최소 움직임을 찾는거에서 완전히 막혀버려 결국 답을 찾아보았다…
실패코드
public static int solution(String name) {
int answer = 0;
char[] arr = name.toCharArray();
char[] arr2 = name.toCharArray();
int tmp = 0;
int tmp2 = 0;
if(arr.equals(arr2))return answer;
for(int i =0; i<arr.length;i++) {//65~90 65 66 25
arr[i] = 'A';
tmp = (int)arr2[i] - (int)arr[i];
tmp2 = 26 - tmp;
if(tmp2<0)tmp2 = tmp2*-1;
if(tmp>tmp2) {
answer +=tmp2;
}else {
answer+=tmp;
}
}
answer += min(name);
return answer;
}
public static int min(String name) {
int result = 0;
return result;
}
찾아본 성공코드
해당코드는 오늘의 개발님의 코드를 가져왔으며, 이분 뿐만아니라 다른 분들도 좌우로 움직이는 부분은 인덱스로
위치를 저장해두고 저장된 인덱스를 기준으로 Math.min() 메소드를 이용하여 최소 움직임을 찾아내는 것을 확인하였다.
(i * 2) + len - nextIndex
정말 이 식을 찾아내지 못한다면, 어떻게 풀어야할지 감이 안잡힌다. 해당 식은 왔던길을 다시 되돌아가는(i*2)에 모든 길이(len)를 더하고 A가 있는 부분은
모두 nextIndex로 위치를 올렸기 때문에 빼주면 되돌아온 최소움직임이 완성이 된다.
하지만 문제 자체가 많이 어려운 것 같다보니, 테스트코드만 맞는 코드도 있고, 다른 테스트 코드를 적용하면 기댓값이 맞지 않는 코드도 많은 것 같다.
알게 된 것
혹여라도 좌우로 움직이는 것을 찾을 때 (i * 2) + len - nextIndex 해당 식을 이용하면 좋을 것 같다. 풀다보면 반복되는 것이 있을 것이고 지금 모른다고 하더라도
다음에도 모르면 안된다는 마음가짐으로 해야겠다. (어렵다 후…)