[μκ³ λ¦¬μ¦ || νλ‘κ·Έλλ¨Έμ€] ν€ν¨λ λλ₯΄κΈ°, μ κ·μ test() ν¨μ (feat.λΉλλμ μ½λ리뷰)
μ€λλ ν μ μλ κ²λ€μ μμλλ‘ λ¨Όμ λμ΄ν΄λ΄€λ€.
function solution(numbers, hand) {
const click = [];
const keypad = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9],
['*', 0, '#']
]
const findKey = (n) => {
let result = [];
keypad.forEach((line, i) => {
if (line.findIndex(v => v === n) !== -1) {
result = [i, line.findIndex(v => v === n)];
return;
}
})
return result;
}
let [leftNow, rightNow] = [[3, 0], [3, 2]];
numbers.forEach(n => {
const left = [1, 4, 7];
const right = [3, 6, 9];
const leftFn = () => {
click.push("L");
leftNow = nPosition;
}
const rightFn = () => {
click.push("R");
rightNow = nPosition;
}
let nPosition = findKey(n);
if (left.includes(n)) {
leftFn();
}
else if (right.includes(n)) {
rightFn();
}
else {
let distance = (nowPosition) => Math.abs(nPosition[0] - nowPosition[0]) + Math.abs(nPosition[1] - nowPosition[1])
const leftD = distance(leftNow);
const rightD = distance(rightNow);
if (leftD === rightD) {
hand === "left" ? leftFn() : rightFn();
} else {
leftD < rightD ? leftFn() : rightFn();
}
}
});
return click.join("")
}
left, right λ°°μ΄μμ findIndex νλ λΆλΆμ μ κ·μμΌλ‘ λ°κΏ μ μλ€.
if (/[147]/.test(x)) {
leftFn();
}
if (/[369]/.test(x)) {
rightFn();
}
μ²μμ test ν¨μκ° μμ±ν μ¬λμ΄ λ§λ μμμ ν¨μμΈ μ€ μμλλ°,
μκ³ λ³΄λ μ κ·μ κ³ μ°¨ν¨μμλ€...!!
μ!
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/RegExp/test
test() λ©μλλ μ£Όμ΄μ§ λ¬Έμμ΄μ΄ μ κ· ννμμ λ§μ‘±νλμ§ νλ³νκ³ , κ·Έ μ¬λΆλ₯Ό true λλ falseλ‘ λ°νν©λλ€.
λ§μ‘±νλ€λ 건 -> μ κ· ννμμ΄ μΌμΉνλ λΆλΆμ΄ μλκ°λ₯Ό μλ―Ένλ€.
μ΄λ κ² μ’μ ν¨μλ₯Ό μ΄μ μμλ€λ
μμ mdn μ κΌΌκΌΌν λ³Ό μλ‘ μ΄λμ΄λΉ
λꡬλꡬ κ·Έλ¦¬κ³ μ€λλ§μ λΉλλμ΄ μ½λ 리뷰λ₯Ό ν΄μ£Όμ ¨λ€.
μμΈμ§ κ° μλ‘ κΌΌκΌΌνκ² ν΄μ£Όμλκ±° κ°μμ λ무 κ°μ¬νλΌ....
κ³ μ€λν ν‘μνλ©΄ μΌλ§λ μ’μκΉ!
μλ
νμΈμ λμλ ν΄λΉ μ½λ 리뷰λ₯Ό μμνκ² μ΅λλ€.
λ¨Όμ κΈ°λ₯μ λν μ½λλ₯Ό λΆμνκΈ° μ μ μ½λ μ€νμΌλΆν° μ κ²νκ² μ΅λλ€.
λ§μΉ¨ν μ’
κ²°ν μΈλ―Έν΄λ‘ μ μλ΅ μ¬λΆλ₯Ό μΌκ΄λκ² ν΄μΌν©λλ€.
μ μΆν μ½λλ distance ν¨μλ§ μΈλ―Έν΄λ‘ μ μλ΅νκ³ λλ¨Έμ§ μ½λλ μΈλ―Έν΄λ‘ μ λΆμμ΅λλ€. λ¬Όλ‘ μ€κ°μ μλ΅μ νλ©΄ μλ°μ€ν¬λ¦½νΈ μμ§μμ μλμΌλ‘ μΈλ―Έν΄λ‘ μ λΆμ¬μ£Όλ μμ
μ μννκ² λ©λλ€. νμ§λ§ μΌκ΄λ λ°©μμΌλ‘ ν΅μΌμ ν΄μΌ μ½λμ κ°λ
μ±μ λμΌ μ μμ΅λλ€.
μ... μΈλ―Έμ½λ‘ μ λλ‘ λΆμ΄λμ§λ 보μλ€λ λΉλλμ μμ GPT μλκΉ...?
γ γ γ γ γ γ γ γ γ γ γ γ γ γ γ γ
μ΄κ±΄ κ± μ겨μ κ°μ Έμ΄
λλ μΉμ .....
κ·Έλ¦¬κ³ μ΄μ μ½λμ λν κΈ°λ₯ λΆλΆμ μ κ²νκ² μ΅λλ€.
λ¨Όμ κΈ°μ‘΄μ findKey ν¨μλ forEachλ₯Ό μ¬μ©νμ¬ ν€ν¨λμ κ° νμ μννλ©΄μ,
μ«μ nμ΄ μλ νμ μ°Ύμμ΅λλ€. μ΄ λ findIndex λ©μλλ₯Ό μ¬μ©νμ¬ ν λ΄μμ nμ μμΉλ₯Ό μ°Ύμκ³ , nμ΄ μμΌλ©΄ nμ μμΉλ₯Ό κ²°κ³Όμ μ μ₯νμ΅λλ€.
κ·Έλ¬λ findIndexλ₯Ό λλ² νΈμΆνλ―λ‘ λΉν¨μ¨μ μΌ μ μμ΅λλ€.
κ·Έλμ λ€μκ³Ό κ°μ΄ findIndexλ₯Ό νλ²λ§ νΈμΆνλ κ²μ μΆμ²ν©λλ€.
const findPosition = n => keypad.reduce((acc, row, i) => row.includes(n) ? [i, row.indexOf(n)] : acc, []);
리ν©ν λ§λ findPosition ν¨μμμλ reduce λ©μλλ₯Ό μ¬μ©νμ¬ κ°μ μμ
μ μνν©λλ€.
reduce λ©μλλ λ°°μ΄μ κ° μμμ λν΄ μ£Όμ΄μ§ μ½λ°± ν¨μλ₯Ό μ€ννλ©΄μ, λμ κ°μ κ²°κ³Όλ‘ λ°νν©λλ€.
μ΄ λ μ½λ°± ν¨μλ νμ¬ μμκ° nμ ν¬ν¨νκ³ μλμ§ νμΈνκ³ , nμ΄ μμΌλ©΄ nμ μμΉλ₯Ό λ°ννκ±°λ,
κ·Έλ μ§ μμΌλ©΄ λμ κ°μ κ·Έλλ‘ λ°νν©λλ€.
μ΄λ¬ν λ°©μμ findIndexλ₯Ό λλ² νΈμΆνλ κ²μ νΌνκ³ includesμ indexOfλ₯Ό κ°κ° νλ² μ© μ¬μ©νμ¬
νΈμ¨μ±μ λμμ΅λλ€. κ·Έλ¦¬κ³ κΈ°μ‘΄μ ν¨μμ μ΄λ¦ keyλ κ°μ²΄λ₯Ό μλ―Έν μ μμΌλ©° λΆλΆλͺ
ν©λλ€.
ν¨μκ° νλμΌμ μ½κ² μ΄ν΄ν μ μλ μ΄λ¦μΌλ‘ λ°κΏμΌν©λλ€.
μμΉλ₯Ό μ°Ύλ ν¨μμ΄κΈ° λλ¬Έμ 리ν©ν λ§ λ ν¨μμ μ΄λ¦μ΄ μ μ ν©λλ€.
ν μ΄κ² λ¬΄μ¨ λ§μΌκΉ
μ΄ν΄νκ³ μλͺ» μ΄ν΄ν μ€ λ°ν·
μ΄ ν¨μλ keypadμ κ° μμ (μ¦, κ° ν)μ λν΄ μ½λ°± ν¨μλ₯Ό μ€νν©λλ€.
μ½λ°± ν¨μλ λ κ°μ 맀κ°λ³μλ₯Ό λ°μ΅λλ€. 첫 λ²μ§Έ 맀κ°λ³μλ λμ κ° (acc)μ΄λ©°,
μ΄κΈ°κ°μ λΉ λ°°μ΄ []μ
λλ€. λ λ²μ§Έ 맀κ°λ³μλ νμ¬ μμ (μ¦, νμ¬ ν)μ
λλ€.
μ½λ°± ν¨μλ νμ¬ νμ΄ nμ ν¬ν¨νλμ§ νμΈν©λλ€.
λ§μ½ nμ ν¬ν¨νλ©΄, μ½λ°± ν¨μλ nμ μμΉ ([i, row.indexOf(n)])λ₯Ό λ°νν©λλ€.
μ΄ μμΉλ λ€μ λ°λ³΅μμμ λμ κ°μ΄ λ©λλ€.
λ§μ½ νμ¬ νμ΄ nμ ν¬ν¨νμ§ μμΌλ©΄, μ½λ°± ν¨μλ λμ κ°μ κ·Έλλ‘ λ°νν©λλ€.
μ¦, λμ κ°μ μ΄μ νμμ μ°Ύμ nμ μμΉλ₯Ό μ μ§νκ±°λ,
μμ§ nμ μ°Ύμ§ λͺ»νλ€λ©΄ λΉ λ°°μ΄ []μ μ μ§ν©λλ€.
λ°λΌμ reduce ν¨μλ keypadμ λͺ¨λ νμ μννλ©΄μ nμ μμΉλ₯Ό μ°Ύμ΅λλ€.
λ§μ½ nμ μ°ΎμΌλ©΄ κ·Έ μμΉλ₯Ό λ°ννκ³ , nμ μ°Ύμ§ λͺ»νλ©΄ λΉ λ°°μ΄ []μ λ°νν©λλ€.
λ§μ΄ λΈλ μΈ λ§μΆ€ν μ€λͺ ..... κ°μ¬νλ€....
μ€λ³΅μ½λμ κ±°νκΈ°
leftFn κ³Ό rightFn
κΈ°μ‘΄μ μ½λλ leftFnκ³Ό rightFnμ λ°λ‘ μ μνμμ΅λλ€.
ν΄λΉ ν¨μμ λ΄μ©μ μ
λ ₯κ°λ§ λ€λ₯ΌλΏ νλμΌμ΄ κ°μ ν¨μμ
λλ€.
κ·Έλ¬λ―λ‘ ν΄λΉ ν¨μλ μ€λ³΅μ μ€μ¬μΌν©λλ€.
distance ν¨μ
κΈ°μ‘΄μ μ½λλ forEach μμμ 쑰건문λ₯Ό ν΅ν΄ 거리 ν¨μλ₯Ό μ μ νμμ΅λλ€.
κΈ°μ‘΄μ μ½λ if μ else ifλ "L" λλ "R"λ₯Ό μ΄μ©νκ³ μμΉλ₯Ό λμ
ν©λλ€.
νμ§λ§ distance ν¨μκ° μ μλ else λ¬Έμ 보면 if μ else...ifμ λ€λ₯΄κ²
μΆκ°μ μΈ κ±°λ¦¬ ν¨μλ₯Ό μ μνλ©° μ€ννκ³ μμ΅λλ€.
쑰건문μμ elseλ¬Έλ§ ν¨μλ₯Ό μ μλ₯Ό νκ³ μκΈ°λλ¬Έμ
μ΄μ μ μ¬λ¦° 리ν©ν λ§λ ν¨μ (findPostion)μ κ°μ μ€μ½νμ μμΉνλ κ²μ΄ μ μ ν©λλ€.
const findPosition = n => keypad.reduce((acc, row, i) => row.includes(n) ? [i, row.indexOf(n)] : acc, []);
const distance = (p1, p2) => Math.abs(p1[0] - p2[0]) + Math.abs(p1[1] - p2[1]);
μ¦ μ‘°κ±΄λ¬Έμμ ν¨μλ₯Ό μ μνμ§ λ§κ³ forEach λ¬Έ λ°μμ μ μνμλ©΄ λ©λλ€.
μ€νΈ...
κ·Έλ¬λκΉ else if λ¬Έ μμμ ν¨μλ₯Ό μ μ νλλ°, ...
μ΄ λΆλΆ μμ±ν λ else λ¬Έμμλ§ μ°λκΉ else λ¬Έ μμ λ£μ΄μΌμ§~ νκ³ μ΄κ±΄λ°
쑰건문 μ 체μ νλ¦..? λλ¬Έμ 쑰건문 λ°μμ μ°λ κ² μ μ νλ€κ³ μ΄ν΄νλ©΄ λλκ±ΈκΉ??
μ΅μ’
μμ λ 리ν©ν λ§ μ½λ
const solution = (numbers, hand) => {
const keypad = [[1, 2, 3], [4, 5, 6], [7, 8, 9], ['*', 0, '#']];
let [left, right] = [[3, 0], [3, 2]];
const findPosition = n => keypad.reduce((acc, row, i) => row.includes(n) ? [i, row.indexOf(n)] : acc, []);
const distance = (p1, p2) => Math.abs(p1[0] - p2[0]) + Math.abs(p1[1] - p2[1]);
return numbers.map(n => {
const pos = findPosition(n);
const [leftKeys, rightKeys] = [[1, 4, 7], [3, 6, 9]];
if (leftKeys.includes(n)) {
left = pos;
return 'L';
} else if (rightKeys.includes(n)) {
right = pos;
return 'R';
} else {
const [leftDist, rightDist] = [distance(left, pos), distance(right, pos)];
const result = leftDist < rightDist || (leftDist === rightDist && hand === 'left') ? 'L' : 'R';
result === 'L' ? left = pos : right = pos;
return result;
}
}).join('');
}
ꡬ쑰 λΆν΄ ν λΉ λ¬Έλ² μ¬μ©νκΈ°
const left = [1, 4, 7];
const right = [3, 6, 9];
μμ μ½λλ κΈ°μ‘΄μ μ½λμ
λλ€. left rightλ³μλ μλ‘ μ°κ΄μ΄ μλ λ°°μ΄μ
λλ€. λ€μκ³Ό κ°μ΄ λ°κΏμ μμ΅λλ€.
const [leftKeys, rightKeys] = [[1, 4, 7], [3, 6, 9]];
3.
κΈ°μ‘΄μ μ½λλ 쑰건문μ ν΅ν΄ "L"κ³Ό "R"μ click λ°°μ΄μ μ μ₯νκ³ νμ¬ μμΉλ₯Ό κ°±μ νμμ΅λλ€.
κ·Έλ¦¬κ³ κ°μ μΌμ νλ€λ κ²μ μ리기 μν΄ leftFn, rightFn ν¨μλ₯Ό μ μνλκ²μ
μ€λ³΅μ μ€μΌ μ μμ΄μ μ’μ μ κ·Όμ
λλ€.
const leftFn = () => {
click.push("L");
leftNow = nPosition;
}
const rightFn = () => {
click.push("R");
rightNow = nPosition;
}
λ€λ§ ν΄λΉ ν¨μλ€μ μλ‘ κ°μ μΌμ νκ³ κ·Έλ¦¬κ³ ν¨μμ μΌμ΄ λ§€μ° μ§§μ΅λλ€.
κ·Έλ¦¬κ³ ν΄λΉ ν¨μλ₯Ό μ€λ³΅μ λ¬Άμ λ§νΌ 쑰건문μμ λκ°μ§ μΌμ νμ§ μμ΅λλ€.
κ·Έλμ ν¨μλ₯Ό λ§λ€μ§ μκ³ μ‘°κ±΄λ¬Έμ λ³΄λ€ κ°κ²°νκ² μ§€μ μμ΅λλ€.
νΉν else λ¬Έμ 보μλ©΄ λ ν¨μμ λ΄μ©μ 쑰건문 λ΄λΆλ‘ μ§μ μ΄λμμΌ μ€λ³΅μ½λλ₯Ό μ κ±°νμμ΅λλ€.
if (leftKeys.includes(n)) {
left = pos;
return 'L';
} else if (rightKeys.includes(n)) {
right = pos;
return 'R';
} else {
const [leftDist, rightDist] = [distance(left, pos), distance(right, pos)];
const result = leftDist < rightDist || (leftDist === rightDist && hand === 'left') ? 'L' : 'R';
result === 'L' ? left = pos : right = pos;
4.
κ·Έλ¦¬κ³ else λ¬Έμ μλ 볡μ‘ν 쑰건문μ κ°κ²°μμΌ°μ΅λλ€.
κΈ°μ‘΄μ μ½λ
else {
let distance = (nowPosition) => Math.abs(nPosition[0] - nowPosition[0]) + Math.abs(nPosition[1] - nowPosition[1])
const leftD = distance(leftNow);
const rightD = distance(rightNow);
if (leftD === rightD) {
hand === "left" ? leftFn() : rightFn();
} else {
leftD < rightD ? leftFn() : rightFn();
}
}
리ν©ν λ§ν μ½λ
else {
const [leftDist, rightDist] = [distance(left, pos), distance(right, pos)];
const result = leftDist < rightDist || (leftDist === rightDist && hand === 'left') ? 'L' : 'R';
result === 'L' ? left = pos : right = pos;
return result;
}
μΊ¬ μΌνμ°μ°μλ λ Όλ¦¬μ°μ°μ λ₯Ό μ΄μ©ν΄μ μ λ κ² κ°λ¨νκ² λ§λ€ μ μꡬλ...!
λλ κ°μ κ²½μ°λ λ€ λ°λ‘ ν΄λλ°,
|| λ€μ κ°μ κ²½μ°λ ν΄λΉλλκΉ κ·Έ μ΄νμ λ§μΆ°μ λ€μ L μ μΆλ ₯ν μ§ R μ μΆλ ₯ν μ§λ₯Ό κ²°μ ν μ μκ΅°..!
L, R μ λν΄μ λ¨Όμ κ²°λ‘ μ λ΄λ¦¬κ³ , κ·Έμ λ°λΌ pos (μ’ν) λ₯Ό λ£μ΄μ€λ€.
κ·Έλ¦¬κ³ L μΈμ§ R μΈμ§ return ν΄λ²λ¦Ό.
λ§μ§λ§μΌλ‘ forEach λ³΄λ€ map ν¨μλ₯Ό μ¬μ©νμ¬ κ° μ«μμ λν ν΄λ¦ κ²°κ³Όλ₯Ό μ¦μ λ³νμ μμΌ
click μ΄λΌλ λ°°μ΄μ μ§μ μ μν νμκ° μμ΄μ‘μ΅λλ€.
μ€... μ΄μ°¨νΌ λ°°μ΄μ λ§λ€κ±°λκΉ map μ μ΄μ©ν΄μ ν€ν€ ν λ°°μ΄ μ체λ₯Ό join("") ν κ°μ return νλ©΄ λκ² κ΅¬λ...!
μ 체 μμμ return ν΄μΌνλ κ°μ΄ λ°°μ΄μ΄λΌλ©΄ map μ΄ μλ‘μ΄ λ°°μ΄μ λ°ννλ€λ κ±Έ μ΄μ©νλ©΄ λͺ¬κ° λ©μ§ μ½λλ₯Ό 지 μ μκ΅°!
κ³΅λΆ λ€ νμΌλ λ€μ μ§λ³΄μ..!!