1. shuffle λ©”μ„œλ“œ μ„€λͺ…

shuffle 레퍼런슀 μ„€λͺ… :

μ•„λž˜ shuffle 레퍼런슀 μ½”λ“œμ— λŒ€ν•΄μ„œ μ΅œλŒ€ν•œ μžμ„Ένžˆ μ„€λͺ…ν•΄μ£Όμ„Έμš”!

  • μ½”λ“œλ₯Ό ν•œ 쀄씩 μ„€λͺ…ν•΄λ³΄μ„Έμš”. (μ½”λ“œμ˜ 각 ν‚€μ›Œλ“œκ°€ 무슨 μ˜λ―ΈμΈμ§€ ν•œ 번 λ˜λŒμ•„λ΄…μ‹œλ‹€.)
  • 이 λ©”μ„œλ“œμ˜ μž‘λ™ 원리에 λŒ€ν•΄μ„œ μ„€λͺ…ν•΄μ£Όμ„Έμš”.
  • ν•„μš”ν•œ κ²½μš°κ°€ μ–΄λ–€ κ²½μš°κ°€ μžˆμ„μ§€ κ³ λ―Όν•˜μ—¬ ν•˜λ‚˜μ˜ 예λ₯Ό λ“€μ–΄μ£Όμ„Έμš”.

πŸ‘‰ reference code

_.shuffle = function (arr) {
  let arrCloned = arr.slice();
  for (let fromIdx = 0; fromIdx < arr.length; fromIdx++) {
    const toIdx = Math.floor(Math.random() * arr.length);
    let temp = arrCloned[fromIdx];
    arrCloned[fromIdx] = arrCloned[toIdx];
    arrCloned[toIdx] = temp;
  }
  return arrCloned;
};

shuffle λ©”μ„œλ“œλŠ” λ°°μ—΄ μš”μ†Œμ˜ μˆœμ„œκ°€ λžœλ€ν•˜κ²Œ λ³€κ²½λœ μƒˆλ‘œμš΄ 배열을 λ¦¬ν„΄ν•œλ‹€.

λ‹€μ–‘ν•œ 상황 (ex. λΉ„λ””μ˜€ λ˜λŠ” μŒμ•… μž¬μƒμ˜ μˆœμ„œλ₯Ό μ„žμ„ λ•Œ) μ—μ„œ μœ μš©ν•˜κ²Œ 쓰일 수 μžˆλ‹€.

그러면 본격적으둜 μ½”λ“œλ₯Ό μ„€λͺ…ν•˜κΈ°μœ„ν•΄ ν•œ 쀄씩 νŒŒν—€μ³λ³΄μž !

πŸ‘‰ code

let arrCloned = arr.slice();

arrCloned μ΄λΌλŠ” λ³€μˆ˜μ— 얕은 볡사λ₯Ό ν†΅ν•˜μ—¬ 배열을 κ°€μ Έμ™”λ‹€. μ—¬κΈ°μ„œ μ€‘μš”ν•œ 점은 slice() λŠ” 원본을 λŒ€μ²΄ν•˜μ§€ μ•ŠλŠ” 점, 즉 원본은 λ”°λ‘œ μžˆλ‹€λŠ” λœ»μ΄λ‹€.

String 및 Number 객체 κ°€ μ•„λ‹Œ 경우 λ¬Έμžμ—΄κ³Ό μˆ«μžλŠ” μƒˆ 배열에 λ³΅μ‚¬ν•œλ‹€. 이 μƒˆ λ°°μ—΄μ—μ„œλŠ” λ§ˆμŒλŒ€λ‘œ 값을 바꿔도 원본에 μ•„λ¬΄λŸ° 영ν–₯을 주지 μ•ŠλŠ” λ‹€λŠ” 점을 λͺ…μ‹¬ν•˜μž.

 for (let fromIdx = 0; fromIdx < arr.length; fromIdx++) {

주어진 λ°°μ—΄μ˜ μš”μ†Œλ₯Ό ν™•μΈν•˜κΈ° μœ„ν•΄ for loop λ₯Ό μ‚¬μš©ν•˜μ˜€λ‹€. 일반적인 λ°°μ—΄ λ°˜λ³΅λ¬Έμ΄λ‹€.

const toIdx = Math.floor(Math.random() * arr.length);

μ΄λΆ€λΆ„μ—μ„œ 특히 random() λ©”μ„œλ“œκ°€ μƒμ†Œν•΄μ„œ 많이 μ°Ύμ•„λ΄€λ˜ 것 κ°™λ‹€. λ¨Όμ € ranmdom() λ©”μ„œλ“œλŠ” 0이상 1 미만의 λΆ€λ™μ†Œμˆ«μ  μ˜μ‚¬ λ‚œμˆ˜λ₯Ό λ°˜ν™˜ κ°’μœΌλ‘œ ν•œλ‹€.
κ·Έλ ‡κΈ°λ•Œλ¬Έμ— μ•žμ— floor(λ°˜λ²„λ¦Ό) λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ μ •μˆ˜μΈ λ‚œμˆ˜λ₯Ό μƒμ„±ν•œλ‹€κ³  보면 될 것 κ°™λ‹€. round(반올림) λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•  수 도 μžˆμ§€λ§Œ, μ΄λ ‡κ²Œ ν•˜λ©΄ λ‚œμˆ˜κ°€ κ³ λ₯΄κ²Œ λΆ„ν¬ν•˜μ§€ μ•Šκ²Œ λœλ‹€.

random() λ©”μ„œλ“œμ— λ°°μ—΄μ˜ 길이(arr.length)λ₯Ό κ³±ν•΄μ€€ μ΄μœ λŠ” λ°°μ—΄μ˜ 길이에 κ°€κΉŒμš΄ μž„μ˜μ˜ μ •μˆ˜λ₯Ό μƒμ„±ν•˜κΈ° μœ„ν•¨μΈ 것 κ°™λ‹€.

let temp = arrCloned[fromIdx];

얕은볡사λ₯Ό 톡해 κ°€μ Έμ˜¨ λ°°μ—΄μ˜ μš”μ†Œλ₯Ό tempλΌλŠ” λ³€μˆ˜μ— 할당을 ν•œλ‹€. 할당을 ν•œ μ΄μœ μ— λŒ€ν•΄μ„œλŠ” λ°‘μ—μ„œ μ„€λͺ…ν•œλ‹€.

λ‹€μŒ μ½”λ“œλ₯Ό λ„˜μ–΄κ°€κΈ° 전에 λ°°μ—΄ 비ꡬ쑰화 ν• λ‹Ή 문법을 μΆ©λΆ„νžˆ 이해λ₯Ό ν•˜κ³  κ°€μž. 이해λ₯Ό 돕기 μœ„ν•΄ λ¨Όμ € κ°„λ‹¨ν•œ μ½”λ“œλ₯Ό μ˜ˆμ‹œλ‘œ λ“ λ‹€.

const array = [1, 2];
const [one, two] = array;

console.log(one); // 1
console.log(two); // 2

이 문법은 λ°°μ—΄ μ•ˆμ— μžˆλŠ” μ›μ†Œλ₯Ό λ‹€λ₯Έ μ΄λ¦„μœΌλ‘œ μƒˆλ‘œ μ„ μ–Έν•΄μ£Όκ³  싢을 λ•Œ μ‚¬μš©ν•˜λ©΄ 맀우 μœ μš©ν•˜λ‹€.

arrCloned[fromIdx] = arrCloned[toIdx];
arrCloned[toIdx] = temp;

이 μ½”λ“œλ₯Ό μ„€λͺ…ν•˜κΈ° μœ„ν•΄ λ¨Όμ € arrCloned = [1, β€˜a’, 2, β€˜b’] λΌλŠ” 배열이라고 κ°€μ •ν•˜μž.
λ°˜λ³΅λ¬Έμ„ 톡해 첫번째 i λŠ” arrCloned[0] κ°€ 될 것이고 값은 1 이닀. toIdxλŠ” random() λ©”μ„œλ“œλ₯Ό 톡해 μž„μ˜λ‘œ 3의 μ •μˆ˜κ°€ λ‚˜μ™”λ‹€κ³  κ°€μ •ν•˜μž.
μœ„μ— μ½”λ“œλŠ”
arrCloned[0] = arrCloned[3];
arrCloned[3] = temp (arrCloned[fromIdx] λ³€μˆ˜λ₯Ό ν• λ‹Ήν•œ 이유);
μ΄λ ‡κ²Œ λ°˜λ³΅λ¬Έμ„ ν•œ 번 돌고 λ‚˜λ©΄ 배열은 [β€˜b’, β€˜a’, 2, 1] μ΄λΌλŠ” κ°’μœΌλ‘œ μž„μ˜λ‘œ λ³€ν•˜κ²Œ λœλ‹€. 이런 μ‹μœΌλ‘œ λ°˜λ³΅λ¬Έμ„ λ‹€ λŒκ³ λ‚˜λ©΄ λžœλ€ν•˜κ²Œ λ³€κ²½λœ μƒˆλ‘œμš΄ λ°°μ—΄ 값이 λ‚˜μ˜¬ 것 이닀.
이 뢀뢄이 shuffle λ©”μ„œλ“œμ˜ 핡심인 것 κ°™λ‹€.

return arrCloned;

그리고 λ°˜λ³΅λ¬Έμ„ λ‹€λŒκ³  μƒˆλ‘œ λ°°μ—΄λœ λ°°μ—΄ 값을 리턴(λ°˜ν™˜) ν•΄μ€€λ‹€.

이 곡뢀λ₯Ό 톡해 shuffle λ©”μ„œλ“œλ₯Ό μ™„λ²½νžˆ 짚고 λ„˜μ–΄κ°ˆ 수 있게 λ˜μ—ˆλ‹€. 얕은 볡사λ₯Ό 톡해 λžœλ€ν•˜κ²Œ 배열을 μ„žμ„ λ•Œ μ‚¬μš©ν•˜λ©΄ μœ μš©ν•œ λ©”μ„œλ“œλΌκ³  μƒκ°ν•œλ‹€. μ•žμ„œ μ„€λͺ…ν–ˆλ“―이 μŒμ•… μž¬μƒμ„ 랜덀으둜 돌릴 λ•Œλ‚˜ λ¬΄μž‘μœ„λ‘œ μ„žκ³  싢을 λ•Œ μ‚¬μš©ν•˜λ©΄ μœ μš©ν•  것 κ°™λ‹€.




2. 객체 21번

객체 문제 :

λ¬Έμžμ—΄μ„ μž…λ ₯λ°›μ•„ κ°€μž₯ 많이 λ°˜λ³΅λ˜λŠ” 문자λ₯Ό 리턴해야 ν•©λ‹ˆλ‹€.

  • μ£Όμ˜μ‚¬ν•­ :
  1. λ„μ–΄μ“°κΈ°λŠ” μ œμ™Έ
  2. κ°€μž₯ 많이 λ°˜λ³΅λ˜λŠ” λ¬Έμžκ°€ λ‹€μˆ˜μΌ 경우, λ¨Όμ € λ„λ‹¬ν•œ 문자λ₯Ό 리턴
  3. 빈 λ¬Έμžμ—΄μ„ μž…λ ₯받은 경우, 빈 λ¬Έμžμ—΄μ„ 리턴
  • μž…μΆœλ ₯ μ˜ˆμ‹œ
let output = mostFrequentCharacter("apples not oranges");
console.log(output); // --> 'p'

output = mostFrequentCharacter("hello world");
console.log(output); // --> 'l'
  • pseudocode(μˆ˜λ„μ½”λ“œ)
  1. λ¬Έμžμ—΄μ„ 반볡문으둜 순회λ₯Ό ν•˜λ©΄μ„œ μ–΄λ–€ λ¬Έμžκ°€ κ°€μž₯ 많이 λ°˜λ³΅λ˜λŠ”μ§€ 카운트λ₯Ό μ„Έμ–΄μ£Όμ–΄μ•Ό ν•œλ‹€.
  2. λ¦¬ν„΄λ˜λŠ” 값은 λ¬Έμžμ—΄μ΄κΈ° λ•Œλ¬Έμ— λ¬Έμžμ—΄λ„ 같이 ν• λ‹Ήν•œλ‹€.
  3. 반볡문으둜 λ¬Έμžμ—΄μ„ μˆœνšŒν•˜λ©΄μ„œ, λ„μ–΄μ“°κΈ°λŠ” κ±΄λ„ˆλ›°κ³  객체에 key κ°’κ³Ό value값을 ν• λ‹Ήν•œλ‹€.
  4. 반볡문으둜 λ¬Έμžμ—΄μ„ μˆœνšŒν•˜λ©΄μ„œ, λ°˜λ³΅λ˜λŠ” λ¬Έμžμ—΄μ„ μΉ΄μš΄νŠΈν•΄μ€€λ‹€.
  5. κ°€μž₯ 많이 카운트 된 문자λ₯Ό κ°€μ Έμ˜¨λ‹€.
  6. 비ꡬ쑰화 할당을 톡해 κ°€μž₯ 많이 반볡된 문자λ₯Ό ν• λ‹Ήν•œλ‹€.
  7. ν• λ‹Ήλœ 객체λ₯Ό λ¦¬ν„΄ν•œλ‹€.
let obj = {max: 0, countStr: ""};
for (let i = 0; i < str.length; i++) {
  if (str[i] === " ") {
    continue;
  }
  if (obj[str[i]] === undefined) {
    obj[str[i]] = 0;
  }
  obj[str[i]]++;
  if (obj["max"] < obj[str[i]]) {
    obj["max"] = obj[str[i]];
    obj["countStr"] = str[i];
  }
}
return obj["countStr"];

이 문제의 핡심은 λ¨Όμ € 카운트λ₯Ό ν•  객체λ₯Ό ν• λ‹Ήν•˜κ³ , μΉ΄μš΄νŠΈκ°€ 된 값을 비ꡬ쑰화 ν• λ‹ΉμœΌλ‘œ κ°€μ Έμ˜€λŠ” 것이닀.
λ‚˜λŠ” 이 문제λ₯Ό ν’€ λ•Œ μ²˜μŒμ—λŠ” max = str[0] 둜 ν• λ‹Ήν•˜κ³  max κ°’μ˜ 문자λ₯Ό λ°˜ν™˜ν•˜λ €κ³  ν–ˆλ‹€. 였랜 μ‚½μ§ˆ 끝에

let obj = {};
let max = str[0];
if (str === "") {
  return "";
}

for (let i = 0; i < str.length; i++) {
  if (str[i] === " ") {
    continue;
  } else if (obj[str[i]] === undefined) {
    obj[str[i]] = 0;
  }
  obj[str[i]]++;
  if (obj[max] < obj[str[i]]) {
    obj[str[i]];
    max = str[i];
  }
}
if (Object.keys(obj).length === 0) {
  return "";
}
return max;

이 μ½”λ“œλ‘œ 문제λ₯Ό 풀어보기도 ν–ˆλ‹€. ν•˜μ§€λ§Œ 이 μ‚½μ§ˆμ΄ κ²°κ΅­ HA μ‹œν—˜μ— 큰 도움이 λ˜μ—ˆλ‹€. HA μ‹œν—˜ 1번 문제λ₯Ό κ°€λ³κ²Œ ν’€ 수 μžˆμ—ˆλ‹€.




3. κ³ μ°¨ν•¨μˆ˜ 31번

κ³ μ°¨ν•¨μˆ˜ 문제 :

μ•„λž˜ 쑰건에 맞게 λ³€ν˜•λœ 배열을 리턴해야 ν•©λ‹ˆλ‹€.

  • μ£Όμ˜μ‚¬ν•­ :
  1. 반볡문 μ‚¬μš© κΈˆμ§€
  2. 배열을 리턴
  3. ν•™μƒλ“€μ˜ 성적을 ν‰κ· κ°’μœΌλ‘œ λ³€ν˜•ν•΄μ•Ό ν•©λ‹ˆλ‹€.
  • μž…μΆœλ ₯ μ˜ˆμ‹œ
let studentList = [
  {
    name: "Anna",
    gender: "female",
    grades: [4.5, 3.5, 4]
  },
  {
    name: "Dennis",
    gender: "male",
    country: "Germany",
    grades: [5, 1.5, 4]
  },
  {
    name: "Martha",
    gender: "female",
    grades: [5, 4, 4, 3]
  }
];

console.log(output); // -->
[
  {name: "Anna", gender: "female", grades: 4},
  {name: "Martha", gender: "female", grades: 4}
];
  • pseudocode(μˆ˜λ„μ½”λ“œ)
  1. λ¨Όμ € value 값이 β€˜female’ 인 κ²ƒλ§Œ 필터링을 ν•œλ‹€.
  2. λ³€ν˜•λœ 값을 λ°˜ν™˜ν•˜κΈ° μœ„ν•΄ 맡핑을 ν•˜λ©° 리턴을 ν•œλ‹€.
  3. 평균 값을 κ΅¬ν•˜κΈ° μœ„ν•΄ reduce ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•œλ‹€.
  4. κ΅¬ν•œ 평균값을 객체에 ν• λ‹Ήν•΄μ€€λ‹€.
  5. 객체λ₯Ό 리턴(λ°˜ν™˜)ν•œλ‹€.
const filtering = students.filter(el => el.gender === "female");

return filtering.map(function (el) {
  const average = el.grades.reduce(function (acc, cur) {
    return acc + cur;
  }, 0);

  const grade = average / el.grades.length;
  el.grades = grade;

  return el;
});

각 ν•¨μˆ˜μ˜ λœ»μ„ μ •ν™•νžˆ μ΄ν•΄ν•˜λ©΄ μ‰½κ²Œ ν’€ 수 μžˆλŠ” λ¬Έμ œμ˜€λ‹€. ν•¨μˆ˜λ₯Ό ν•˜λ‚˜μ”© μ°¨κ·Ό μ°¨κ·Ό μ¨κ°€λ©΄μ„œ λ‚΄λ €κ°€λ³΄λ‹ˆ 닡을 찾을 수 μžˆμ—ˆλ‹€.
ν•˜μ§€λ§Œ 이 문제 λ˜ν•œ μ‚½μ§ˆμ„ μ•ˆ ν•œκ±΄ μ•„λ‹ˆλ‹€. λ§€κ°œλ³€μˆ˜ el 값을 계속 κ°€μ Έμ˜€λ©΄μ„œ λ§ˆμ§€λ§‰μ— 평균 값을 ν• λ‹Ήν•˜λŠ” 것이 λ§‰ν˜”μ—ˆλ‹€.
원리λ₯Ό ν•˜λ‚˜μ”© μ§šμ–΄λ³΄λ©° ν’€μ–΄κ°€λ‹€λ³΄λ‹ˆ ν•΄κ²°ν•  수 μžˆμ—ˆλ‹€.



πŸ‘Š λ‚΄μΌμ˜ TIW(today I Will)

μž¬κ·€ν•¨μˆ˜, μ•Œκ³ λ¦¬μ¦˜