알고리즘

프로그래머스 조이스틱 (JAVA)

박카스마시며코딩 2022. 7. 10. 21:24

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

저는 구현을 통해 해당 문제를 해결하였습니다.

저는 위 아래 조작과 좌 우 조작을 나누어 구하였습니다.

위 아래 조작은 A로 부터 위로 올라가는 것이 빠른지, A에서 밑으로 (Z에서 밑으로) 가는게 더 빠른지를 판단하였습니다. 

좌 우 조작은 min을 길이로 초기화하였습니다. 최소한 한 방향으로 한바퀴 돌면 모두 변경할 수 있기 때문입니다.

그리고  각각의 문자를 돌면서 해당 문자에서 다음으로 A가 아닌 문자를 찾습니다. 그리고 min과 (2*i) + size - nextIndex과 비교합니다.

이는 i까지 갔다가 다시 반대로 가서 해당 A가 아닌 문자까지 가는 경로입니다.

또한 반대로도 고려해야합니다. (size - nextIndex)*2 + i

반대로 A가 아닌 문자까지 갔다가 현재 i번째까지 오는 경로입니다. 

 

class Solution {
    
    public int solution(String name) {
        int answer = 0;
        int size = name.length();
        int min = size -1;
        for(int i = 0 ; i < name.length() ; i++){
            answer += cal(name.charAt(i));
            int nextIndex = i + 1;
            while(nextIndex < size && name.charAt(nextIndex) == 'A'){
                nextIndex++;
            }
            min = Math.min(min, (i*2) + size - nextIndex);
            min = Math.min(min,(size - nextIndex)*2 + i);
        }
        answer += min;
        return answer;
    }
    private int cal(char nameCh){
        return Math.min(Math.abs(nameCh - 'A'), Math.abs(nameCh - 'Z') + 1);
    }
}

 

 

참조

https://velog.io/@jeeseob5761/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%A1%B0%EC%9D%B4%EC%8A%A4%ED%8B%B1