반응형
12-24 00:25
- Today
- Total
Link
개발하는 고라니
[Programmers] 조이스틱 본문
반응형
나의 문제 접근법
- 주어진 문자열을 문자 배열로 변환하고, 각 문자로의 이동 회수를 구했다.
- 예를 들어 "JAN"이라는 문자열이 주어지면 첫번째 'A'에서 'J'로 갈 수 있는 이동횟수는 오른쪽으로 이동했을 때 9회, 왼쪽으로 이동했을 때 16회인데, 이 둘 중 최소값인 9를 택한다.
- 마찬가지로 두번째 문자에 대해서도 동일한 방법으로 이동회수를 구한다.
- 현재 문자에서 왼쪽과 오른쪽으로 탐색을 하는데, 이 때 'A'가 아닌 문자가 있는 곳을 찾는다.
- 예를 들어 "JAN"이 입력일 때, 현재 'J'에 있다면 우측에 2번 더 가야 'A'가 아닌 문자 'N'이 있고, 좌측으로 1번 가면 'A'가 아닌 문자 'N'이 있다.
- 여기서 좌측으로 1번만 가면 'A'가 아닌 문자가 있기 때문에 좌측으로 가는 것을 택한다.
# Code </>
class Solution {
static class Data{
int idx, cnt;
public Data(int idx, int cnt) {
this.idx = idx;
this.cnt = cnt;
}
}
static int n;
static char[] str = new char[20];
static int up(char target){
return target - 'A';
}
static int down(char target){
return 'Z' - target + 1;
}
static Data getLeft(int cur){
int idx = cur;
int cnt = 0;
while(true){
idx--;
cnt++;
if(idx < 0) idx = n;
if(str[idx] != 'A') return new Data(idx, cnt);
if(idx == cur) break;
}
return null;
}
static Data getRight(int cur){
int idx = cur;
int cnt = 0;
while(true){
idx++;
cnt++;
if(idx > n) idx = 0;
if(str[idx] != 'A') return new Data(idx, cnt);
if(idx == cur) break;
}
return null;
}
public int solution(String name) {
n = name.length() - 1;
str = name.toCharArray();
int move = 0;
int cur = 0;
for(int i=0; i<=n; i++)
move += Math.min(up(str[i]), down(str[i]));
str[0] = 'A';
for(int i=0; i<=n; i++){
Data left = getLeft(cur);
Data right = getRight(cur);
int min = 9999999;
int idx = -1;
if(left != null){
min = Math.min(min, left.cnt);
idx = left.idx;
}
if(right != null){
min = Math.min(min, right.cnt);
idx = right.idx;
}
if(idx != -1) {
cur = idx;
move += min;
str[cur] = 'A';
}
}
return move;
}
}
반응형
'Programming > 프로그래머스' 카테고리의 다른 글
[Programmers] 단어 변환 (0) | 2021.10.03 |
---|---|
[Programmers] 여행경로 (0) | 2021.10.03 |
[Programmers] 소수 찾기 (0) | 2021.05.26 |
[Programmers] 게임 맵 최단거리 (0) | 2021.05.26 |
[Programmers] 리틀 프렌즈 사천성 (0) | 2021.05.17 |
Comments