728x90
- 각 알파벳을 만들기 위한 상하 조작 최소 횟수 구하기
- A → B → ... → Z: 위로 i번 (총 26자)
- A → Z는 아래로 1번이 더 빠름
- Math.min(char - 'A', 'Z' - char + 1)
- 좌우 이동 최솟값 찾기
- 왼쪽/오른쪽으로 이동하며 커서를 움직여야 함
- 중간에 "A"가 연속될 경우 건너뛰는 전략이 필요
- 기본은 오른쪽으로 name.length() - 1번 이동
- A가 연속될 경우 뒤로 갔다가 다시 가는 방식이 더 짧을 수 있음
- ➤ Greedy하게 모든 지점에서 연속된 A를 고려하며 최단 이동 계산
class Solution {
public int solution(String name) {
int answer = 0;
int length = name.length();
// 1. 상하 조작 횟수
for (int i = 0; i < length; i++) {
char c = name.charAt(i);
answer += Math.min(c - 'A', 'Z' - c + 1);
}
// 2. 좌우 이동 최소화
int minMove = length - 1; // 기본: 한쪽으로 끝까지 가기
for (int i = 0; i < length; i++) {
int next = i + 1;
// 연속된 A 구간 찾기
while (next < length && name.charAt(next) == 'A') {
next++;
}
// 좌→우→뒤로 돌아가는 경로, 또는 우→좌→앞으로 가는 경로 중 최소
minMove = Math.min(minMove, i + length - next + Math.min(i, length - next));
}
answer += minMove;
return answer;
}
}
'Algorithm > Programmers' 카테고리의 다른 글
기능개발 : Java (0) | 2025.07.05 |
---|---|
완주하지 못한 사람 : Java (0) | 2025.07.05 |
[Lv.2] 소수찾기 : Java (0) | 2025.07.05 |
[Lv.2] 피로도 : Java / DFS+백트래킹 (0) | 2025.07.05 |
[Lv.3] 이중우선순위큐 (0) | 2025.07.04 |