Algorithm
프로그래머스: 조이스틱
10Biliion
2025. 4. 21. 15:36
문제
이름을 만들기 위해 조이스틱을 조작하는 최소 횟수를 구하는 문제입니다.
- 조이스틱은 ▲(위), ▼(아래), ◀(왼쪽), ▶(오른쪽)으로 움직입니다.
- ▲: A부터 Z로, ▼: Z부터 A로 변경
- 목표 문자열은 알파벳 대문자로 이루어져 있고, 처음에는 모든 문자가 A로 되어 있음
- 커서를 좌우로 이동하며 알파벳을 변경해 원하는 이름을 만들어야 함
핵심
- 위/아래 조작 (▲▼)
- 각 문자마다 A에서 목표 문자로 바꾸기 위해 최소 몇 번 이동해야 하는지를 계산
- Math.min(name.charAt(i) - 'A', 'Z' - name.charAt(i) + 1) 를 사용해서 위로 가는 경우와 아래로 가는 경우 중 더 작은 값 사용
- 좌/우 조작 (◀▶)
- 단순히 오른쪽으로만 이동하면 length - 1번이 필요하지만,
- 중간에 A가 연속되는 구간은 굳이 방문하지 않아도 되므로 최적의 경로를 계산해야 함
코드구현
class Solution {
public int solution(String name) {
int answer = 0;
int length = name.length();
// ▲▼ 최소 횟수 계산
for (int i = 0; i < length; i++) {
answer += Math.min(name.charAt(i) - 'A', 'Z' - name.charAt(i) + 1);
}
// ◀▶ 이동 최소값 계산
int move = length - 1; // 그냥 오른쪽으로만 가는 경우
for (int i = 0; i < length; i++) {
int next = i + 1;
// A가 연속되는 구간 찾기
while (next < length && name.charAt(next) == 'A') {
next++;
}
// 1. 오른쪽 → i → 왼쪽 → 끝까지
move = Math.min(move, i * 2 + length - next);
// 2. 왼쪽 → 끝까지 → 오른쪽 → i
move = Math.min(move, (length - next) * 2 + i);
}
return answer + move;
}
}