코딩테스트/프로그래머스
[코딩테스트] Java 조이스틱
[dev] hiro
2024. 11. 18. 18:27
제가 공부한 내용을 정리하는 블로그입니다.
아직 많이 부족하고 배울게 너무나도 많습니다. 틀린내용이 있으면 언제나 가감없이 말씀해주시면 감사하겠습니다😁
Programmers 알고리즘 고득점 Kit입니다.
포인트
커서의 위치를 찾는 것이 포인트였습니다. 아무리해도 정답이 안되어서 서치를 진행하였는데 전체 왕복 횟수를 계산하는 로직입니다.
소스코드
class Solution {
public int solution(String name) {
int answer = 0;
int len = name.length();
int index;
int move = len;
for(int i = 0; i < len; i++){
answer += Math.min(name.charAt(i) - 'A', 'Z' - name.charAt(i) + 1);
index = i + 1;
while(index < len && name.charAt(index) == 'A'){
index++;
}
move = Math.min(move, i * 2 + len - index);
move = Math.min(move, (len - index) * 2 + i);
}
return answer + move;
}
}
코드 설명
- for(int i = 0; i < len; i++) { answer += Math.min(name.charAt(i) - 'A', 'Z' - name.charAt(i) + 1); }
- name.charAt(i) - 'A'는 'A'부터 현재 문자까지 위쪽 방향으로 이동할 때의 이동 횟수입니다.
- 'Z' - name.charAt(i) + 1은 'Z'에서 반대 방향으로 이동하여 현재 문자에 도달하는 경우의 이동 횟수입니다.
- 이 두 값 중 최소값을 취해 answer에 더합니다.
- 좌우 이동 횟수 계산
- index는 현재 위치 i에서 시작하여, 연속된 'A' 구간의 끝을 찾기 위해 사용됩니다.
- index가 문자열의 끝(len)에 도달하거나 'A'가 아닌 문자를 만나면 반복문을 종료합니다.
- move = Math.min(move, i * 2 + len - index); move = Math.min(move, (len - index) * 2 + i);
- move는 현재까지 구한 좌우 이동의 최소값을 유지합니다.
- i * 2 + len - index는 첫 번째 위치에서 i까지 이동한 후 다시 돌아와 남은 부분을 탐색하는 경우의 이동 거리입니다.
- (len - index) * 2 + i는 반대 방향으로 탐색하다가 다시 i까지 돌아오는 경우의 이동 거리입니다.
- 두 가지 방식 중 최소 이동 횟수를 move에 갱신합니다.
- return answer + move;
- answer는 상하 이동 횟수의 총합이고, move는 최소 좌우 이동 횟수입니다. 이 둘을 합하여 최소 조이스틱 조작 횟수를 반환합니다.