문제 설명
조이스틱으로 알파벳 이름을 완성하세요. 맨 처음엔 A로만 이루어져 있습니다.ex) 완성해야 하는 이름이 세 글자면 AAA, 네 글자면 AAAA
조이스틱을 각 방향으로 움직이면 아래와 같습니다.
▲ - 다음 알파벳 ▼ - 이전 알파벳 (A에서 아래쪽으로 이동하면 Z로) ◀ - 커서를 왼쪽으로 이동 (첫 번째 위치에서 왼쪽으로 이동하면 마지막 문자에 커서) ▶ - 커서를 오른쪽으로 이동
예를 들어 아래의 방법으로 JAZ를 만들 수 있습니다.
- `첫 번째 위치에서 조이스틱을 위로 9번 조작하여 J를 완성합니다.
- 조이스틱을 왼쪽으로 1번 조작하여 커서를 마지막 문자 위치로 이동시킵니다.
- 마지막 위치에서 조이스틱을 아래로 1번 조작하여 Z를 완성합니다.
따라서 11번 이동시켜 "JAZ"를 만들 수 있고, 이때가 최소 이동입니다.`
만들고자 하는 이름 name이 매개변수로 주어질 때, 이름에 대해 조이스틱 조작 횟수의 최솟값을 return 하도록 solution 함수를 만드세요.
제한 사항
- name은 알파벳 대문자로만 이루어져 있습니다.
- name의 길이는 1 이상 20 이하입니다.
입출력 예시
name | return |
---|---|
"JEROEN" | 56 |
"JAN" | 23 |
풀이
- 조이스틱을 위아래로 이동하는 함수와
- 왼쪽과 오른쪽으로 이동하는 것의 횟수를 최소화 하는 방법이 필요하다.
답
아래 답은 11번 테스트케이슬 통과하지 못했다...
왼쪽과 오른쪽을 정해서 돌렸는데.. 문자열을 하나씩 바꾸고 A가 아닌 값이 왼쪽으로든 오른쪽으로든 가장 가까울 때로 바꿔봐야 할 듯하다.
-
//조이스틱으로 알파벳 이름을 완성하세요. //1. 맨 처음엔 A로만 이루어져 있습니다. ex) 완성해야 하는 이름이 세 글자면 AAA, 네 글자면 AAAA //2. 알파벳은 대문자로만 이루어져 있습니다. //3. 위로 A -> B -> C 이 순서대로 다음 알파뱃으로 이동한다. //4. 아래오 A -> Z 이 순서대로 다음 알파뱃으로 이동한다 //5. 왼쪽으로 첫번쨰 위치에서 왼쪽으로 이동하면 마지막 문자에 커서 //6. 오른쪽으로 이동 다음 문자로 이동 //A -> Z 순서로 이동하는게 빠를지? //Z -> A 순서로 이동하는게 빠를지 //계산한다음에 이동한다. //다음 문자열로 이동한다. //모든 문자열을 알맞게 바꾸었을때 조이스틱 조작 횟수를 리턴한다. function basicformat(n){ let result = []; for(let i=0;i<n;i++){ result.push("A"); } return result; } function alphaMove(letter){ if(!letter){ console.log(letter); return ; } let index = letter.charCodeAt()-64; //아스키코드 값으로 바꾼다/ A = 1, Z = 26 //A -> Z 로 가는게 빠를지 Z -> A로 가는 게 빠를지 어떻게 판단하면 될까? if(index > 13){ return 26-index+1 }else{ return index-1; } } function leftright(name){ let left = 1; let right = 1; for(let i=1;i<name.length;i++){ if(name[i]!=='A'){ break; } else{ right++; } } for(let i=name.length-1;i>=0;i++){ if(name[i]!=='A'){ break; } else{ left++; } } if(left===right){ return "right"; } return left > right ? "right" : "left"; } function solution(name) { //A초기상태를 먼저 가져온다.. let basic = basicformat(name.length); let result = 0; //결과값 넣을 곳 let direction = leftright(name); if(direction === "left"){ result++; basic[0] = name[0]; result+=alphaMove(name[0]); for(let i=name.length-1;i>=0;i--,result++){ if(name[i]!=="A") { basic[i]=name[i]; result+=alphaMove(name[i]); } if(basic.join("")===name) { break; } } } else { for(let i=0;i<name.length;i++,result++){ if(name[i]!=="A") { basic[i]=name[i]; result+=alphaMove(name[i]); } if(basic.join("")===name) { break; } } } return result; }
-
위에서 이야기한 것처럼 수정해서 11번 테스트케이스를 통과했습니다!.
왼쪽으로 돌아가고 오른쪽으로 돌아가면서 가장 빠르게 a가 아닌값을 찾을떄 마다로 바꾸었습니다.
//조이스틱으로 알파벳 이름을 완성하세요.
//1. 맨 처음엔 A로만 이루어져 있습니다. ex) 완성해야 하는 이름이 세 글자면 AAA, 네 글자면 AAAA
//2. 알파벳은 대문자로만 이루어져 있습니다.
//3. 위로 A -> B -> C 이 순서대로 다음 알파뱃으로 이동한다.
//4. 아래오 A -> Z 이 순서대로 다음 알파뱃으로 이동한다
//5. 왼쪽으로 첫번쨰 위치에서 왼쪽으로 이동하면 마지막 문자에 커서
//6. 오른쪽으로 이동 다음 문자로 이동
//A -> Z 순서로 이동하는게 빠를지?
//Z -> A 순서로 이동하는게 빠를지
//계산한다음에 이동한다.
//다음 문자열로 이동한다.
//모든 문자열을 알맞게 바꾸었을때 조이스틱 조작 횟수를 리턴한다.
//AAZ AAAAZ ZAAZ AAZZAZ
// ABCDEFGHIJKLMNOPQRSTUVWXYZ
function basicformat(n){
let result = [];
for(let i=0;i<n;i++)
{
result.push("A");
}
return result;
}
function alphaMove(letter){
if(!letter){
return ;
}
let index = letter.charCodeAt()-64; //아스키코드 값으로 바꾼다/ A = 1, Z = 26
//A -> Z 로 가는게 빠를지 Z -> A로 가는 게 빠를지 어떻게 판단하면 될까?
if(index > 13){
return 26-index+1
}else{
return index-1;
}
}
//가장 가까운 a값을 찾는 것..
function leftright(name,index){
let left = 1;
let right = 1;
let rightindex = index;
let leftindex = index;
while(true){
rightindex++;
if(rightindex===name.length){
rightindex = 0;
}
if(name[rightindex]!=='A'){
break;
}
else{
right++;
}
}
while(true){
leftindex--;
if(leftindex < 0){
leftindex = name.length-1;
}
if(name[leftindex]!=='A'){
break;
}
else{
left++;
}
}
if(left===right){
return [right,rightindex];
}
return left > right ? [right,rightindex] : [left,leftindex];
}
function solution(name)
{
//A초기상태를 먼저 가져온다..
let basic = basicformat(name.length);
let result = 0; //결과값 넣을 곳
//복사한 name 값을 만든다
let cpname = name;
//가장 가까운 a 값을 찾는다...
let updown = name.split("").map(element => alphaMove(element))
updown = updown.reduce((acc,cur)=>(acc+cur),0);
//while 문을 돌린다. cpname 을 전부 AAAAA로 바꿀떄까지 맞춘다
cpname = cpname.split("");
cpname[0] = "A";
let nowindex = 0;
while(cpname.join("")!==basic.join("")){
//방향설정을 먼저한다.
let [count, index] = leftright(cpname,nowindex);
result+=count;
cpname[index] = 'A';
nowindex = index;
}
return result+updown;
}
'알고리즘구현능력 > 문제해결능력' 카테고리의 다른 글
[javascript ]카펫 - 완전탐색, 수학 (0) | 2020.08.25 |
---|---|
[javascript] 튜플 - 정렬 (0) | 2020.08.25 |
[Javascript] H-index - 정렬 (0) | 2020.08.21 |
[javascript] 타켓넘버 - DFS/BFS (0) | 2020.08.21 |
[javascript] 괄호변환 - (완전탐색, 재귀) (0) | 2020.08.20 |