본문으로 바로가기

[프로그래머스] 조이스틱 -JAVA

category 알고리즘 2020. 9. 6. 20:20

조이스틱

문제 설명

조이스틱으로 알파벳 이름을 완성하세요. 맨 처음엔 A로만 이루어져 있습니다. ex) 완성해야 하는 이름이 세 글자면 AAA, 네 글자면 AAAA

조이스틱을 각 방향으로 움직이면 아래와 같습니다.

예를 들어 아래의 방법으로 JAZ를 만들 수 있습니다.

만들고자 하는 이름 name이 매개변수로 주어질 때, 이름에 대해 조이스틱 조작 횟수의 최솟값을 return 하도록 solution 함수를 만드세요.

제한 사항
  • name은 알파벳 대문자로만 이루어져 있습니다.
  • name의 길이는 1 이상 20 이하입니다.
입출력 예
namereturn
JEROEN56
JAN23

 

 

풀이

그리디로 문제를 해결하면 된다.

현재 위치에서 바꿀수 있는 가장 가까운곳으로 가면 된다.

문제를 읽어봤으면 알겠지만 초기상태가 전부 다 A로 세팅 되어 있으니 A는 건들지 않아도 된다.

 

예를들어 만들고자 하는 문자열이 AJA 인 경우 초기 주어지는 문자열은 AAA 이므로

J 까지 가서 조이스틱을 조작해서 초기 문자열로 주어진 A를 J로 바꿔주면 된다.

 

 

초기 알파벳 A에서 원하는 알파벳으로 바꾸기 위한 건 아래의 표를 보기 바란다.

 

 ABCDEFGHIJKLMNOPQRS
왼쪽02524232221201918171615141312111098
오른쪽0123456789101112131415161718

 

 TUVWXYZ
왼쪽7654321
오른쪽19202122232425

 

이 표는 A에서 해당 알파벳으로 가는데 왼쪽/오른쪽으로 조이스틱을 이용해서 원하는 문자열을 만드는데 걸리는 횟수이다.

나는 이거를 미리 배열로 표시를 했다.

 

2차원 배열로 설정해

alpha_num[0] [어떠한수] 일 경우 오른쪽으로 진할 때 걸리는 횟수

alpha_num[1] [어떠한수] 일 경우 왼쪽으로 진행 할 때 걸리는 횟수

이대로 하면 위의 표와 정확히 똑같은 값이 배열에 담긴다.

 

만약 예를들어서 원하는 알파벳이 J라고 하면

Math.min(alpha_num[0] ['J'-'A'] , alpha_num[1] ['J'-'A'])

이렇게 하면 알아서 저절로 해당 알파벳을 만드는데까지 최소한의 횟수가 나오게 된다.

 

 

 

그 다음 매개변수로 주어지는 String name을 char 배열에 한 칸씩 담아준다

그 다음 각 인덱스를 순회하며 A인 경우 방문 할 필요가 없으니 방문 처리를 해준다

 

 

그 다음 문자열을 순회하며 왼쪽으로 갈지, 오른쪽으로 갈 지 체크를 하고 더해주면 된다.

나머진 코드 주석으로 설명을 대체한다.

 

전체코드