https://school.programmers.co.kr/learn/courses/30/lessons/42860
프로그래머스
SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
입력
문자열 name은 조이스틱으로 만들어야 하는 목표 이름을 의미
모든 문자는 A~Z로 구성되며, 시작 상태는 모두 'A'로 초기화됨
핵심 아이디어
세로 방향은 각 문자마다 A에서 목표 문자까지의 최소 조작 수를 계산
가로 방향은 커서를 어떻게 움직이면 최소인지 탐색하며 연속된 A 구간을 활용해 최적 경로 계산
가장 먼저 연속된 A 구간의 위치를 파악하고, 앞뒤로 돌아가는 여러 경로 중 이동 횟수가 가장 작은 경우를 선택
총 조작 횟수는 세로 조작 수의 합과 가로 조작 수를 더한 값
변수설명
alphabet은 알파벳 대문자 A~Z를 담은 문자열
answer는 최종 조작 횟수를 누적하는 변수
horizontal은 최소 좌우 이동 횟수를 계산하는 메서드
vertical은 문자 하나에 대한 최소 상하 이동 횟수를 계산하는 메서드
minMove는 가능한 커서 이동 경로 중 최소 이동 거리
moveCase1은 오른쪽 이동 후 뒤로 돌아가는 방식의 이동 거리
moveCase2는 끝까지 갔다가 왼쪽으로 되돌아오는 방식의 이동 거리
to는 현재 문자가 알파벳에서 몇 번째에 위치하는지 계산한 값
예시
name이 "JAZ"인 경우
J는 A에서 9번 이동
A는 그대로
Z는 A에서 1번 역방향 이동
가로 이동은 J → A → Z가 최적인 경우이므로
세로 조작 합은 9 + 0 + 1 = 10
가로 조작은 1
총 조작 횟수는 11
정답코드
package week_5;
public class week5_joystick {
String alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
public int solution(String name) {
int answer = 0;
int horizontal = horizontal(name);
for (char c : name.toCharArray()) {
int vertical = vertical(c);
System.out.println("A to " + c + ": " + vertical);
answer += vertical;
}
return answer + horizontal;
}
private int horizontal(String name) {
int len = name.length();
int minMove = len - 1; // 초기값: 오른쪽으로 쭉 이동
for (int i = 0; i < len; i++) {
int next = i + 1;
// 연속된 'A'가 있는 부분 skip
while (next < len && name.charAt(next) == 'A') {
next++;
}
// 처음부터 i까지 가고 → 뒤로 돌아가서 끝까지
int moveCase1 = i * 2 + (len - next);
// 끝까지 갔다가 < 돌아와서 i까지
int moveCase2 = (len - next) * 2 + i;
minMove = Math.min(minMove, Math.min(moveCase1, moveCase2));
}
return minMove;
}
private int vertical(char c) {
// 여기에 위, 아래로 돌리는거 중 뭐가 더 빠른가 판단
// 시작은 무조건 A
int from = 0;
int to = alphabet.indexOf(c);
return Math.min(Math.abs(to - from), 26 - Math.abs(to - from));
}
}
'코딩테스트 > 문제풀이' 카테고리의 다른 글
[프로그래머스] 이모티콘 할인 행사 Java (0) | 2025.07.13 |
---|---|
[프로그래머스] 지게차와 크레인 Java (0) | 2025.07.05 |
[프로그래머스] 미로 탈출 Java (0) | 2025.07.05 |
[프로그래머스] 게임 맵 최단거리 Java (0) | 2025.07.05 |
[프로그래머스] 서버 증설 횟수 Java (0) | 2025.07.05 |