キーボードを押す
1.問題の説明
スマートフォンの電話キーボードの各スペースには、次の数字があります.
この電話のキーボードには、左手と右手の親指で数字を入力したいだけです.最初の左手親指. *
キーボードの右手親指 #
キーボードの位置から親指を使うルールは次のとおりです.
1
, 4
, 7
入力時に左手親指を使用.3
, 6
, 9
入力時に右手親指を使用.2
, 5
, 8
, 0
入力時は、両親指の現在のキーボード位置より近い親指を使用します.4-1.2つの親指の距離が等しい場合は、右利きは右手親指、左利きは左手親指を使用します.[制限]
"left"
または "right"
."left"
左利きで、 "right"
右利きを示す.L
右手親指使用時 R
を順に接続し、文字列で返してください.I/O例
I/O例説明
I/O例#1
順番は[1,3,4,5,8,2,4,5,9,5]、右利きです.
したがって
"LRLLLRLLRRL"
戻る.I/O例#2
左利き[7,0,8,2,8,3,1,5,7,6,2]を押して使う手
"LRLLRRLLLRR"
.I/O例#3
右利きを[1,2,3,4,5,6,7,8,9,0]の順に押して使用する手
"LLRLLRLLRL"
.2.理解 let l = [1, 4, 7, 10] // 왼손
let m = [2, 5, 8, 11] // 중앙
let r = [3, 6, 9, 12] // 오른손
左手固定[1,4,7]、右手固定[3,6,9].真ん中の[2,5,8,0]で左手でも右手でも最後の数字に近い手で押します.中央の数字0を押す必要がある場合、距離をより容易にするために、左手の*は10で、真ん中の0は11で、右手の#は12です.また、キーボードを押すたびに、押す数字と配列のインデックス値が保存され、移動距離が得られます.function solution(numbers, hand) {
var answer = '';
let l = [1, 4, 7, 10];
let r = [3, 6, 9, 12];
let m = [2, 5, 8, 11];
let ltemp = 10;
let rtemp = 12;
let lidx = 3;
let ridx = 3;
for (let i = 0; i < numbers.length; i++) {
let num = numbers[i];
if (num === 0) num = 11
if (l.indexOf(num) !== -1) {
answer += 'L'
lidx = l.indexOf(num);
ltemp = num;
} else if (r.indexOf(num) !== -1) {
answer += 'R'
ridx = r.indexOf(num);
rtemp = num;
} else if (m.includes(num)) {
let midx = m.indexOf(num);
let ld = lidx > midx ? lidx - midx : midx - lidx;
let rd = ridx > midx ? ridx - midx : midx - ridx;
if (!m.includes(ltemp)) ld++;
if (!m.includes(rtemp)) rd++;
if (ld > rd) {
answer += 'R';
rtemp = num;
ridx = midx;
} else if (ld < rd) {
answer += 'L';
ltemp = num;
lidx = midx;
} else if (ld === rd) {
if (hand === 'left') {
answer += 'L';
ltemp = num;
lidx = midx;
} else if (hand === 'right') {
answer += 'R';
rtemp = num;
ridx = midx;
}
}
}
}
return answer;
}
3.整理
これは簡単な問題で、真ん中の数字を押すと、左手から中央の数字までの距離、右手から中央の数字までの距離を求め、近くの手に中央の数字を押させ、同じ時に手の「左」、「右」を押す.また、左手の*を10に、右手の#を12にすることで移動距離を得ることができます.しかし190行を超えるコードが書かれており、13日から20日までのテストケースは合格しなかった.条件文をたくさん書いても通らないのは、論理が足りないからです.엄지손가락은 상하좌우 4가지 방향으로만 이동할 수 있으며 키패드 이동 한 칸은 거리로 1에 해당합니다.
問題をもう一度読んで、見落としがあった.質問に答えがある.冷静に行こう
Reference
この問題について(キーボードを押す), 我々は、より多くの情報をここで見つけました
https://velog.io/@catalyst88/키패드-누르기
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol
let l = [1, 4, 7, 10] // 왼손
let m = [2, 5, 8, 11] // 중앙
let r = [3, 6, 9, 12] // 오른손
function solution(numbers, hand) {
var answer = '';
let l = [1, 4, 7, 10];
let r = [3, 6, 9, 12];
let m = [2, 5, 8, 11];
let ltemp = 10;
let rtemp = 12;
let lidx = 3;
let ridx = 3;
for (let i = 0; i < numbers.length; i++) {
let num = numbers[i];
if (num === 0) num = 11
if (l.indexOf(num) !== -1) {
answer += 'L'
lidx = l.indexOf(num);
ltemp = num;
} else if (r.indexOf(num) !== -1) {
answer += 'R'
ridx = r.indexOf(num);
rtemp = num;
} else if (m.includes(num)) {
let midx = m.indexOf(num);
let ld = lidx > midx ? lidx - midx : midx - lidx;
let rd = ridx > midx ? ridx - midx : midx - ridx;
if (!m.includes(ltemp)) ld++;
if (!m.includes(rtemp)) rd++;
if (ld > rd) {
answer += 'R';
rtemp = num;
ridx = midx;
} else if (ld < rd) {
answer += 'L';
ltemp = num;
lidx = midx;
} else if (ld === rd) {
if (hand === 'left') {
answer += 'L';
ltemp = num;
lidx = midx;
} else if (hand === 'right') {
answer += 'R';
rtemp = num;
ridx = midx;
}
}
}
}
return answer;
}
これは簡単な問題で、真ん中の数字を押すと、左手から中央の数字までの距離、右手から中央の数字までの距離を求め、近くの手に中央の数字を押させ、同じ時に手の「左」、「右」を押す.また、左手の*を10に、右手の#を12にすることで移動距離を得ることができます.しかし190行を超えるコードが書かれており、13日から20日までのテストケースは合格しなかった.条件文をたくさん書いても通らないのは、論理が足りないからです.
엄지손가락은 상하좌우 4가지 방향으로만 이동할 수 있으며 키패드 이동 한 칸은 거리로 1에 해당합니다.
問題をもう一度読んで、見落としがあった.質問に答えがある.冷静に行こうReference
この問題について(キーボードを押す), 我々は、より多くの情報をここで見つけました https://velog.io/@catalyst88/키패드-누르기テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol