[java] 프로그래머스 - 조이스틱
업데이트:
문제
프로그래머스-조이스틱
주어진 알파벳을 조이스틱을 움직여 완성하는 문제.
주어진 알파벳이 3자리라면 AAA, 4자리라면 AAAA로 시작한다
첫번째 자리에서 왼쪽으로 이동하면 오른쪽 마지막자리로 이동 가능하다
A에서 아래로 한번 이동하면 Z로 이동한다
- 예시
JAZ를 만드는 경우,- J : 위로(a,b,c,d,,,) 9번 조작해서 완성 (횟수 : 9회)
- J의 커서를 왼쪽으로 움직여 Z로 이동 (횟수 : 1회)
- Z : A에서 아래로 1번 조작해서 완성 (횟수 : 1회)
최소 11회로 JAZ를 만들 수 있다
풀이
1) 우선 첫번째 자리부터 시작하므로 첫번째 자리의 단어부터 바꾸고 시작한다.
A에서 올라가는것, Z에서 내려오는것 중 적은 조작횟수를 찾는다.
이때 Z의 경우는 A에서 아래로 한번 더 조작하므로 1추가
2) A가 아닌 자리의 수를 세서 while문의 종료조건으로 사용한다
3) idx를 기준으로 left, right를 지정한다
left의 경우 0보다 작으면 단어의 오른쪽 끝으로, right의 경우 단어의 길이를 벗어나면 왼쪽 끝으로 간다
4) 지정한 left, right가 A인 경우 해당 방향으로 A가 아닐때 까지 이동한다
이때 leftCnt, rightCnt를 두어 인덱스보다 몇 칸 멀리있는지 센다
5) leftCnt와 rightCnt를 비교해서 가까운쪽으로 이동한다
만일 둘다 거리가 같다면 오른쪽으로 이동한다
6) 변환할 글자를 최소횟수만큼 A로 변환하고 조작횟수에 이동거리를 추가한다
7) 변환한 글자를 idx로 놓고 변환해야할 남은 글자수인 cnt를 감소시킨다
3)으로 돌아가서 반복한다
소스코드
class Solution {
public int solution(String name) {
int answer = 0;
char[] arr = name.toCharArray();
// 1) 첫번째 자리 조작횟수 구하기
int min = Math.min(arr[0] - 65, 'Z' - arr[0] + 1);
arr[0] = 'A';
answer += min;
// 2) 종료조건을 위한 변환 위치 개수 세기
int cnt = arr.length;
for (int i = 0; i < arr.length; i++) {
if (arr[i] == 'A')
cnt--;
}
int idx = 0;
while (cnt > 0) {
// 3) 인덱스를 기준으로 left, right를 정한다
int leftCnt = 1, rightCnt = 1;
int left = idx == 0 ? arr.length - 1 : idx - 1;
int right = idx == arr.length - 1 ? 0 : idx + 1;
// 4) left, right를 A가 아닐때까지 움직이고 거리를 센다
while (arr[left] == 'A') {
left--;
leftCnt++;
if (left == -1) {
left = arr.length - 1;
}
}
while (arr[right] == 'A') {
right++;
rightCnt++;
if (right == arr.length) {
right = 0;
}
}
// 5) 왼쪽과 오른쪽 중 거리가 같다면 오른쪽으로 간다
int target = -1;
int t = 0;
if (leftCnt >= rightCnt) {
// right로 간다
target = right;
t = rightCnt;
} else if (leftCnt < rightCnt) {
target = left;
t = leftCnt;
}
// 6) 변환할 글자를 최소횟수만큼 A로 변환하고 조작횟수에 이동거리를 추가한다
answer += Math.min(arr[target] - 65, 'Z' - arr[target] + 1) + t;
// 7) 변환한 글자를 idx로 놓고 변환해야할 남은 글자수인 cnt를 감소시킨다
arr[target] = 'A';
idx = target;
cnt--;
}
return answer;
}
}
댓글남기기