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));
    }
}

+ Recent posts