[JavaScript]キーボードを押す
13033 ワード
プログラマコードテスト練習問題
これは、2020年のKACA実習コードテストで発生した問題です.
162題を見て、二次元配列にインデックスを使えばいいと思ったので、電話のキーボードを二次元配列に変えてreduce関数を使って文字列を返す形でコードを書きました.
function solution(numbers, hand) {
const phone = [
[1,2,3],
[4,5,6],
[7,8,9],
['*',0,'#']];
let left = [3,0]; // 왼손의 첫 인덱스
let right = [3,2]; // 오른손의 첫 인덱스
let tmp = [0,0]; // numbers의 현재 item의 인덱스를 담을 배열
return numbers.reduce((result,item) => {
let numIndex; // 내부배열에 인덱스 값을 담을 변수
for(let i=0; i<phone.length;i++){
numIndex = phone[i].indexOf(item); // indexOf()함수로 현재 요소가 들어있는 내부배열을 찾는다.
if(numIndex > -1){ // indexOf()함수는 배열내에 찾는 요소가 없을 시, -1을 반환한다.
tmp[0]=i; // 요소를 찾은 배열의 인덱스
tmp[1]=numIndex; // 내부배열의 요소의 인덱스
break;
}
}
switch(numIndex){
case 0: // 요소가 1,4,7 이면 내부배열에서의 인덱스는 0.
result += 'L'; // 누적값에 'L'을 담는다.
left = [...tmp];// 스프레드 연산자를 이용해 왼손의 인덱스를 현재 요소의 인덱스로 바꿔준다.
break;
case 2: // 요소가 3,6,7 이면 내부배열에서의 인덱스는 2.
result += 'R';
right = [...tmp];
break;
default: // 나머지 요소들은 왼손과 오른손의 위치를 비교하고 선택.
// 왼손과 오른손의 인덱스와 현 요소의 인덱스를 연산하고, 절대값으로 만들어
// 더해 왼손과 오른손의 인덱스에서 현 요소의 인덱스까지의 거리를 구함.
const leftCnt = Math.abs(left[0]-tmp[0]) + Math.abs(left[1]-tmp[1]);
const rightCnt = Math.abs(right[0]-tmp[0]) + Math.abs(right[1]-tmp[1]);
if(leftCnt > rightCnt){
result += 'R';
right = [...tmp];
}else if(leftCnt === rightCnt){ // 만약 거리가 같다면,
result += hand[0].toUpperCase(); // hand의 앞글자를 대문자로 바꿔서 누적값에 담는다.
hand === 'right' ? right=[...tmp] : left=[...tmp];
}else{
result += 'L';
left = [...tmp];
}
}
return result;
},'');
}
Reference
この問題について([JavaScript]キーボードを押す), 我々は、より多くの情報をここで見つけました https://velog.io/@issac/JavaScript-키패드-누르기テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol