[lv.2] 조이스틱

RTUnu12·2024년 2월 26일
0

Programmers

목록 보기
23/41

https://school.programmers.co.kr/learn/courses/30/lessons/42860#

  • 문제

  • 풀이
    1) 상하일 경우 먼저 계산한다.
    2) A의 연속되는 부분을 찾는다. 이에 따라 앞으로 갈지 뒤로 갈지 결정된다.
    3) 좌우 이동일 경우 3가지가 있는데 이 3가지 중 가장 빠른 것을 결정한다.

    1) 처음 -> 오른쪽 끝
    2) 뒤로 이동
    3) 연속된 A의 앞쪽보다 뒷쪽이 짧은 경우, 뒷쪽부터 조작

  • 소감
    진짜 상당히 어려웠던 문제. 내가 그리디를 좆같이 못하는게 맞구나...
    근데 이거 그리디 아닌거 같은데...

  • 코드

class Solution {
    public int solution(String name) {
        int answer = 0;
        int move = name.length()-1; // 가장 큰 이동 값은 처음부터 끝까지 이동
        for(int i=0; i<name.length(); i++){
            char now = name.charAt(i);
            answer += Math.min(now-'A', 'Z'-now+1); // 상하
            System.out.println(Math.min(now-'A', 'Z'-now+1));
            // 좌우 : 연속된 A에 따라 달라짐
            int next = i+1; // 다음 위치부터
            // 다음이 계속 A라면 next++;
            while(next<name.length() && name.charAt(next)=='A') next++;
            // 순서대로 가는것 vs 뒤로 가는 것
            move = Math.min(move, (i*2)+name.length()-next);
            // 처음부터 뒷부분을 먼저 입력하는 것이 더 빠른 경우도 계산.
            move = Math.min(move, (name.length()-next)*2+i);
        }
        return answer+move;
    }
}
profile
이제 나도 현실에 부딪힐 것이다.

0개의 댓글