[Algorithm] Programmers_조이스틱
function solution(name) {
var answer = 0;
let ascCnt = 0;
let descCnt = 0;
let nameArr = name.split("");
let forwardArr = name.split("");
let reverseArr = forwardArr.slice(0, 1).concat(name.split("").reverse().slice(0, name.length - 1));
if (nameArr.filter((x) => x != "A").length < 1) return 0;
for (var i = 0; i < name.length; i ++) {
if (forwardArr.filter((x) => x != "A").length > 0) {
ascCnt++;
forwardArr = forwardArr.slice(1);
let lastChar = "";
if (forwardArr.length * 1.0 / 2 < forwardArr.findIndex((x) => x != "A")) {
lastChar = forwardArr[0];
forwardArr.reverse();
forwardArr.pop();
forwardArr.unshift(lastChar);
}
}
if (reverseArr.filter((x) => x != "A").length > 0) {
descCnt++;
reverseArr = reverseArr.slice(1);
}
}
ascCnt = ascCnt > 0 ? ascCnt-1 : 0;
descCnt = descCnt > 0 ? descCnt-1 : 0;
for (var i = 0; i < nameArr.length; i ++) {
if (nameArr[i] == 'A') continue;
let code = nameArr[i].charCodeAt();
if (code > 78) {
answer += 25 - Math.abs(code - 65) + 1;
} else {
answer += Math.abs(code - 65);
}
}
answer = ascCnt > descCnt ? answer + descCnt : answer + ascCnt;
return answer;
}
처음 문제 풀 때 고려했던 4가지는 아래와 같다
- 아스키코드로 절대값(A-B) 계산해서 위 아래 중 뭐가 적은지 비교
- 절대값이 12 초과 차이 나면 반대로 가야함
- 만들어야 할 단어가 A 면 스킵하고 넘어가기
- 글자 수 비교해서 왼쪽으로 이동하는게 빠른지 오른쪽으로 이동하는게 빠른지 체크
그런데 위 4가지만 고려하고 코드를 짰을 때는, 테스트케이스에서 1개가 계속 실패했다.
추가로 고려해야했던 상황은
처음엔 정방향으로 갔다가 다시 역순으로 가는게 빠를 때! 이 케이스를 누락했다.
어차피 첫 번째 문자에서 왼쪽 커서를 눌러 오른쪽으로 가게되면 다시 오른쪽으로는 갈 수 없기 때문에
if (forwardArr.length * 1.0 / 2 < forwardArr.findIndex((x) => x != "A")) 이 if 문에 걸리는 경우 그냥 배열을 첫 번째 문자 제외하고 역순으로 뒤집어 버렸다.
어렵다 어려워 알고리즘...
더 좋은 방법이 없나 서치 좀 해봐야겠다.
Author And Source
이 문제에 관하여([Algorithm] Programmers_조이스틱), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@go_by/Algorithm-Programmers-조이스틱저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)