๐Ÿ› ๏ธ Tool/FE

[LeetCode-JS 30 days] #2. Array Transformation - 1(#์ˆœํšŒ)

seungineer = seungwoo + engineer 2024. 8. 6. 01:50

LeetCode JS 30 days Challenge

2024.08.03 - [๐Ÿ› ๏ธ Tool/FE] - [LeetCode-JS 30 days] #1. Closures ๊ฐœ๋… - 1(#์€๋‹‰ #๋ณด์กด)

 

[LeetCode-JS 30 days] #1. Closures ๊ฐœ๋… - 1(#์€๋‹‰ #๋ณด์กด)

์•Œ๊ธฐ ์‰ฝ๊ฒŒ ์“ฐ์˜€๊ณ  ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ๊ฒ€์ฆ๋œ ์„ค๋ช…์ด LeetCode Discuss์— ์˜ฌ๋ผ์˜ค๋Š” ๊ฒƒ์„ ํ™•์ธํ•˜๊ณ , JS Basic ๊ณต๋ถ€์— ์ด๋ฅผ ํ™œ์šฉํ•ด๋ณด๊ณ ์ž ํ•˜์˜€๋‹ค. LeetCode PS์ฒ˜๋Ÿผ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ฉฐ JS์˜ basic skill์„ ์ตํž ์ˆ˜ ์žˆ๋„

seungineer.tistory.com

 

์•Œ๊ธฐ ์‰ฝ๊ฒŒ ์“ฐ์˜€๊ณ  ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ๊ฒ€์ฆ๋œ ์„ค๋ช…์ด LeetCode Discuss์— ์˜ฌ๋ผ์˜ค๋Š” ๊ฒƒ์„ ํ™•์ธํ•˜๊ณ , JS Basic ๊ณต๋ถ€์— ์ด๋ฅผ ํ™œ์šฉํ•ด๋ณด๊ณ ์ž ํ•˜์˜€๋‹ค. LeetCode PS์ฒ˜๋Ÿผ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ฉฐ JS์˜ basic skill์„ ์ตํž ์ˆ˜ ์žˆ๋„๋ก ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค.

  1. Closures
  2. Basic Array Transformations
  3. Function Transformations
  4. Promises and Time
  5. JSON
  6. Classes

์ด 6๊ฐœ์˜ Part๋กœ ๊ตฌ์„ฑ๋˜๋ฉฐ ๋ณธ ํฌ์ŠคํŠธ์—์„œ๋Š” Basic Array Transformation์— ๋Œ€ํ•ด ๋‹ค๋ฃฌ๋‹ค.

Apply Transformation Over Each Element in Array

๋ฌธ์ œ๋ฅผ ํ‘ธ๋Š” ๊ฒƒ๋ณด๋‹ค ํ•ด๋‹น ๋ฌธ์ œ์˜ Discussion์— ๊ณต๋ถ€ํ•  ๋‚ด์šฉ์ด ๋งŽ๋‹ค!

๊ฐ€์žฅ ๋งŽ์€ Upvote๋ฅผ ๋ฐ›์€ Disucss

์š”์•ฝ

Array.map() ๋ฉ”์„œ๋“œ ์‚ฌ์šฉ์„ ์ œํ•œํ•˜๋„๋ก ๋ฌธ์ œ๊ฐ€ ์„ธํŒ…๋œ ์ด์œ ๋Š” ๋ญ˜๊นŒ?

  • Loops, functions, recursion๊ณผ ๊ฐ™์€ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์„ ์ƒ๊ฐํ•ด ๋ณด๋„๋ก ์œ ๋„ํ•œ๋‹ค.
  • ๋Œ€๊ทœ๋ชจ ๋ฐฐ์—ด์—์„œ Array.map()์ด ํ•ญ์ƒ ๊ฐ€์žฅ ํšจ๊ณผ์ ์ด์ง„ ์•Š๋‹ค.
  • ๋‹ค์–‘ํ•œ ๋ฐฐ์—ด ์กฐ์ž‘ ๋ฌธ์ œ ํ•ด๊ฒฐ ๋ฐฉ์‹์— ์ต์ˆ™ํ•ด์ง€๊ธฐ ์œ„ํ•จ์ด๋‹ค.
  • Array.map()์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฌธ์ œ๊ฐ€ ๋„ˆ๋ฌด ์‰ฌ์›Œ์ง„๋‹ค.

1. for๋ฌธ๊ณผ ๊ฐ’์„ ๋‹ด์„ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•

๊ฐ๊ฐ์˜ ๋ฐฐ์—ด ์š”์†Œ์— ๋ฐ˜๋ณต๋ฌธ์œผ๋กœ ์ ‘๊ทผํ•˜์—ฌ fn ํ•จ์ˆ˜๋กœ transform ๋ฐ˜ํ™˜๋˜๋Š” ๊ฐ’์„ ์ปจํ…Œ์ด๋„ˆ์— ์ €์žฅํ•œ๋‹ค.

var map = function(arr, fn) {
  const transformedArr = [];
  for (let i = 0; i < arr.length; i++) {
    transformedArr[i] = fn(arr[i], i);
  }
  return transformedArr;
};

 

์ƒˆ๋กœ์šด ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์•„๋‹Œ ๊ธฐ์กด์— ๊ฐ’์ด ๋‹ด๊ฒจ ์žˆ๋Š” arr๋ฅผ ๋ณ€ํ™˜ํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ๋‹ค.

var map = function(arr, fn) {
    for (let i = 0; i < arr.length; ++i) {
        arr[i] = fn(arr[i], i);
    }
    return arr;
};
  • ์œ„ ๋ฐฉ๋ฒ•์€ bad practice๋กœ ์ด๋ ‡๊ฒŒ๋„ ์ ์šฉ์ด ๋จ๋งŒ์„ ์•Œ๊ณ  ์žˆ์ž.
  • Bad practice์ธ ์ด์œ ๋Š” ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์›๋ณธ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€๊ณตํ•ด๋ฒ„๋ฆฌ๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
  • ์ด๋ ‡๊ฒŒ ๊ฐ€๊ณตํ•ด๋ฒ„๋ ค์„œ ์›๋ณธ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค์‹œ ์š”์ฒญํ•˜๋Š๋‹ˆ ์ƒˆ๋กœ์šด ์ปจํ…Œ์ด๋„ˆ์— ๊ฐ’์„ ์ €์žฅํ•˜๋Š” ๊ฒŒ ๋‚ซ๋‹ค.
python๊ณผ๋Š” ๋‹ค๋ฅด๊ฒŒ ๋ฐฐ์—ด์˜ ์–ด๋–ค index์— ๊ฐ’์ด ์กด์žฌํ•˜์ง€ ์•Š๋”๋ผ๋„ index์— ๊ฐ’์„ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ์Œ

 

Time Complexity, Space Complexity

  • ์œ„ ์ฝ”๋“œ: O(n), O(n)
  • ์•„๋ž˜ ์ฝ”๋“œ: O(n), O(1)

2. forEach ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•

forEach ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ input array๋ฅผ iterate ํ•˜๊ณ , ๊ฐ element์— map function์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์ดํ›„ ์ƒˆ๋กœ์šด  ๋ฐฐ์—ด์— ๋ณ€ํ™˜๋œ ๊ฐ’์„ ์ €์žฅํ•œ๋‹ค.

var map = function(arr, fn) {
  const transformedArr = [];
  arr.forEach((element, index) => {
    transformedArr[index] = fn(element, index);
  });
  return transformedArr;
};
map ๋ฉ”์„œ๋“œ๋Š” ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์„ return ํ•˜์ง€๋งŒ forEach๋Š” undefined๋ฅผ return ํ•จ

 

Time Complexity, Space Complexity

  • O(n), O(n)

3. reduce ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•

reduce ๋ฉ”์„œ๋“œ ๋˜ํ•œ input array๋ฅผ iterate ํ•˜๊ณ , ๊ฐ element์— map function์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์ดํ›„ ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์— ๋ณ€ํ™˜๋œ ๊ฐ’์„ accumulate ํ•  ์ˆ˜ ์žˆ๋‹ค.

var map = function(arr, fn) {
  return arr.reduce((transformedArr, element, index) => {
    transformedArr[index] = fn(element, index);
    return transformedArr;
  }, []);
};
transformedArr๋ฅผ ๋”ฐ๋กœ ์„ ์–ธํ•˜์ง€ ์•Š๊ณ , reduce ๋ฉ”์„œ๋“œ ๋‚ด์—์„œ ์ฒ˜๋ฆฌํ•˜๋ฉฐ, ๋ชจ๋“  ์›์†Œ๋ฅผ iterate ํ•œ ํ›„์—๋Š” accumulate ํ•œ ๋ฐฐ์—ด์„ return ํ•˜๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Œ

 

Time Complexity, Space Complexity

  • O(n), O(n)

reduce ๋ฉ”์„œ๋“œ ํ˜•์‹์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

arr.reduce((acc,cur,idx,src)->{
  return ๊ฒฐ๊ณผ
},์ดˆ๊ธฐ๊ฐ’);

์—ฌ๊ธฐ์„œ ์ดˆ๊ธฐ๊ฐ’์ด ์„ธํŒ…์ด ๋˜์–ด ์žˆ๋ƒ ์—†๋ƒ์— ๋”ฐ๋ผ์„œ ๋ฐ”๋€Œ๋Š” ๋ถ€๋ถ„์ด ์žˆ๋‹ค. ์ดˆ๊ธฐ๊ฐ’์ด ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ idx๊ฐ€ 0์ผ ๋•Œ arr ๋ฐฐ์—ด์˜ 0๋ฒˆ์งธ ๊ฐ’์ด acc์˜ ์ดˆ๊ธฐ๊ฐ’์ด ๋œ๋‹ค. ์ฆ‰, ์ดˆ๊ธฐ๊ฐ’์ด ์—†์œผ๋ฉด idx๋Š” 0์„ ๊ฑด๋„ˆ ๋„๋Š” ๊ฒƒ์ด๋‹ค.

// ์ดˆ๊ธฐ๊ฐ’์ด ์žˆ๋Š” ๊ฒฝ์šฐ
const input = [1,2,3,4];
const result = input.reduce((acc,cur,idx)=>{
  console.log(acc,cur,idx);
  return acc+cur;
},0)
// 0 1 0
// 1 2 1
// 3 3 2
// 6 4 3
console.log(result); //10

// ์ดˆ๊ธฐ๊ฐ’์ด ์—†๋Š” ๊ฒฝ์šฐ
const input = [1,2,3,4];
const result = input.reduce((acc,cur,idx)=>{
  console.log(acc,cur,idx);
  return acc+cur;
})
// 1 2 1
// 3 3 2
// 6 4 3
console.log(result); //10
reduce((acc, cur, idx, src) => {}, ์ดˆ๊ธฐ๊ฐ’) ํ˜•ํƒœ์ด๊ณ , cur, src๋Š” option์ด๋‹ค.
์ดˆ๊ธฐ๊ฐ’์ด ์—†์œผ๋ฉด idx๊ฐ€ 0์ผ ๋•Œ๋ฅผ ๊ฑด๋„ˆ ๋„๊ณ , acc = arr[0]์ด ๋œ๋‹ค.

4. for ... of loop ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•

for๋ฌธ์„ ํ†ตํ•ด input array๋ฅผ iterate ํ•˜๊ณ , ๊ฐ element์— map function์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

var map = function(arr, fn) {
  const transformedArr = [];
  let index = 0;
  for (const element of arr) {
    transformedArr[index] = fn(element, index);
    index++;
  }
  return transformedArr;
};
python์˜ `for k in arr:` ์™€ ๊ฐ™์Œ

 

Filter Elements from Array

Discuss ํƒญ์œผ๋กœ ๋‹ฌ๋ ค ๊ฐ€์ž

์š”์•ฝ

  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ truthy์™€ falsy
// falsy
false;
0
-0
0n (BigInt zero)
'' (empty string)
null
undefined
NaN
// truthy
// falsy๋ฅผ ์ œ์™ธํ•œ ๋ชจ๋‘
// ์•„๋ž˜๋„ ํฌํ•จ๋จ์„ ์œ ์˜
'0' (๋‹จ์ผ์˜ zero๋ฅผ ํฌํ•จํ•˜๋Š” string)
'false' (๋ฌธ์ž์—ด false๋ฅผ ํฌํ•จํ•˜๋Š” string)
[] (empty array)
{} (empty object)
function() {} (empty function)
python๊ณผ ๋‹ฌ๋ฆฌ ๋นˆ ๋ฐฐ์—ด, ๋นˆ ๊ฐ์ฒด๋„ true

 

์•ž์„œ ์‚ดํŽด๋ณธ ๋‚ด์šฉ๊ณผ ์ค‘๋ณต๋œ ๋‚ด์šฉ์€ ์ œ์™ธํ•˜์˜€๋‹ค.

1. flatMap ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•

๋ฐฐ์—ด์˜ ๊ฐ ์š”์†Œ์— ํ•จ์ˆ˜๋ฅผ ์ ์šฉํ•˜๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋“ค์„ ์ƒˆ๋กœ์šด ๋ฐฐ์—ด๋กœ ๋งŒ๋“ ๋‹ค(flatten).

var filter = function(arr, fn) {
  return arr.flatMap((i, j) => fn(i, j) ? [i] : []);
};

arr = [1, 2, 3, 4, 5];
fn = (i, j) => i % 2 === 0;
filter(arr, fn); // [2, 4]

๋ฐฐ์—ด์— ๊ฐ’์ด ์žˆ๋Š” ๊ฒฝ์šฐ๋งŒ์œผ๋กœ ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์„ return ํ•จ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.