S E P H ' S

[Java] 조이스틱 본문

Algorithm/Programmers

[Java] 조이스틱

yoseph0310 2023. 4. 28. 22:02

 

 

프로그래머스

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

programmers.co.kr

문제 풀이

조건에 맞게 조이스틱 조작 횟수의 최솟값을 구하는 문제였다. 조작 횟수의 최소값은 두가지로 나누어서 구하는 것이 핵심이다.

 

1. 알파벳 선택하기

 

A 에서 주어진 알파벳까지 조작하는데 A ~ 주어진 알파벳 의 값과 주어진 알파벳 ~ Z + 1 (A에서 반대로 조작하는 것도 있으므로 주어진 알파벳에서 Z 까지의 값과 A를 포함한 +1 까지 해준다.) 중 최소를 선택한다.

 

2. 커서 이동횟수 구하기

 

가장 헤맸던 부분이다. 처음엔 while문을 통해서 idx가 가리키는 값 기준으로 왼쪽, 오른쪽 값을 확인해서 'A'이면 되돌아가는 방식으로 생각 했는데 중간마다 'A'가 나오는 구간이 많을 경우를 미처 생각하지 못했다. 그래서 수많은 테스트 케이스를 통과하지 못했다. 또한, 중간에 'A'가 나오는 구간이 많을 경우에 'A'가 가장 많이 나오는 것을 스킵해야 이동횟수를 최소화 할 수 있는 것까지 생각해야 한다.

 

가장 중요하게 고려해야 하는 것은 인덱스를 늘려가면서 'A'인 구간을 카운트해서 그 구간을 제외한 곳을 최소로 방문하는 것이 문제의 핵심이었다. 

 

class Solution {
    public int solution(String name) {
        int answer = 0;
        int length = name.length();
        
        int move = length - 1;
        
        for (int i = 0; i < length; i++) {
            answer += Math.min(name.charAt(i) - 'A', 'Z' - name.charAt(i) + 1);
                
            int idx = i + 1;
            
            while (idx < length && name.charAt(idx) == 'A') {
                idx++;
            }    
            
            move = Math.min(move, i + length - idx + Math.min(i, length - idx));
        }

        return answer + move;
    }
}

'Algorithm > Programmers' 카테고리의 다른 글

[Java] n^2 배열 자르기  (0) 2023.05.22
[Java] 2개 이하로 다른 비트  (0) 2023.05.15
[Java] 주식가격  (0) 2023.04.25
[Java] 단체사진 찍기  (0) 2023.04.14
[Java] 2 x n 타일링  (0) 2023.04.13