문제

Write a function createHelloWorld. It should return a new function that always returns "Hello World".

 

예제

createHelloWorld 함수에 의해 만들어진 함수는 항상 "Hello World"를 반환해야 한다.

 

함수에 인자가 포함될 수 있지만 함수는 항상 "Hello World" 만을 반환해야 한다.

 


코드

/**
 * @return {Function}
 */
var createHelloWorld = function() {
    
    return function(...args) {
        return "Hello World";
    }
};

/**
 * const f = createHelloWorld();
 * f(); // "Hello World"
 */

 

함수에 어떠한 인자가 들어와도 호출 시 항상 "Hello World"를 반환한다.

문제

Given a function fn, return a new function that is identical to the original function except that it ensures fn is called at most once.

The first time the returned function is called, it should return the same result as fn.
Every subsequent time it is called, it should return undefined.

 

예제

처음 호출 시 fn에 argument 값들이 올바르게 들어가고 값을 반환한다.

하지만 두번째 호출부터는 fn 함수를 호출하지 않고 undefined를 반환한다.

마찬가지로 처음 호출 시 fn 함수에 주어진 argument 값들이 올바르게 들어간 뒤 값을 반환하지만,

이후에는 fn 함수를 호출하지 않고 undefined를 반환한다.

 

 


코드

/**
 * @param {Function} fn
 * @return {Function}
 */
var once = function(fn) {
    let isUsed = false;
    return function(...args){
        if (!isUsed) {
            isUsed = true;
            return fn(...args);
        }
    }
};

/**
 * let fn = (a,b,c) => (a + b + c)
 * let onceFn = once(fn)
 *
 * onceFn(1,2,3); // 6
 * onceFn(2,3,6); // returns undefined without calling fn
 */

 

isUsed라는 변수를 기본값 false로 초기화한 뒤, 함수가 실행되면 true로 변환한다.

함수는 isUsed가 false일 때, 즉 처음 호출 시에만 fn 함수를 실행시키고, 이후부터는 isUsed가 true이기 때문에 if 문이 실행되지 않고 undefined를 반환한다.

문제

Write a function createCounter. It should accept an initial integer init. It should return an object with three functions.

The three functions are:

increment() increases the current value by 1 and then returns it.
decrement() reduces the current value by 1 and then returns it.
reset() sets the current value to init and then returns it.

 

예제

counter 변수는 increment, decrement, reset 함수들이 들어있는 객체를 반환하는데, 각 함수를 실행시킬 때마다 counter 내에 있는 값이 함수 기능에 의해 계산된 뒤 반환됨.

 

counter 내부의 값은 보존되기 때문에, 증가하는 함수인 increment()를 여러 번 호출할 시 내부 값이 해당 횟수만큼 오르는 모습을 확인할 수 있음.

 


코드

/**
 * @param {integer} init
 * @return { increment: Function, decrement: Function, reset: Function }
 */
var createCounter = function(init) {
    let counter = init;
    
    return {
        increment() {
            counter += 1;
            return counter;
        },
        decrement() {
            counter -= 1;
            return counter;
        },
        reset() {
            counter = init;
            return counter;
        }
    }
};

/**
 * const counter = createCounter(5)
 * counter.increment(); // 6
 * counter.reset(); // 5
 * counter.decrement(); // 4
 */

 

함수 createCounter의 반환값은 3개의 함수가 들어있는 객체가 된다.

 

1. increment() : counter 값을 1 증가시킨다.

2. decrement() : counter 값을 1 감소시킨다.

3. reset() : counter 값을 init으로 초기화시킨다.

문제

Write a generator function that returns a generator object which yields the fibonacci sequence.

The fibonacci sequence is defined by the relation Xn = Xn-1 + Xn-2.

The first few numbers of the series are 0, 1, 1, 2, 3, 5, 8, 13.

 

예제

gen.next().value는 호출할 때마다 피보나치의 다음 숫자가 출력된다.

 

gen.next()가 호출되지 않았으므로 아무것도 출력되지 않는다.

 


코드

/**
 * @return {Generator<number>}
 */
var fibGenerator = function*() {
    const fib = [0, 1];
    let idx = 0;
    
    yield 0;
    idx += 1;
    
    yield 1;
    idx += 1;
    
    while (idx <= 50) {
        fib.push(fib[fib.length - 2] + fib[fib.length - 1]);
        idx += 1;
        
        yield fib[fib.length - 1]
    }
};

/**
 * const gen = fibGenerator();
 * gen.next().value; // 0
 * gen.next().value; // 1
 */

 

JavaScript의 generator는 언제든지 실행을 중지하고 재개할 수 있는 함수로, 내부의 변수 값들은 출입 과정에서 저장된 상태로 남아있습니다.

Generator 함수는 호출되어도 즉시 실행되지 않는 대신 Iterator 객체가 반환됩니다.

이후 Iterator의 next() 메서드를 호출하면 Generator 함수가 실행되어 yield 문을 만날때까지 진행하고, 반환값은 다음과 같습니다.

 

`{value: <반환값>, done: <완료 여부>}`

 

만약 정상적으로 yield문을 만났다면 해당 반환값이 value에 담기고, done에는 false가 담겨있게 됩니다. 만약 yield문을 만나지 못하고 함수가 종료되었을 경우, value 값에는 undefined가 담기고 done에는 함수 실행을 모두 완료했다는 의미로 true가 담기게 됩니다.

 

문제

Given an integer array arr and a mapping function fn, return a new array with a transformation applied to each element.

The returned array should be created such that returnedArray[i] = fn(arr[i], i).

Please solve it without the built-in Array.map method.

 

예제

Arrays.map을 구현하는 함수로써, arr 원소들을 돌며 각각 fn(n) 값을 구해 새로운 배열에 넣는다.

위 예제의 경우 plusI의 두번째 파라미터로 인덱스가 들어가는 것에 유의한다.

 

constant() 함수가 파라미터에 상관없이 42를 반환하기 때문에 답은 arr의 길이만큼 42로 채워져 있는 배열이 된다.


코드

/**
 * @param {number[]} arr
 * @param {Function} fn
 * @return {number[]}
 */
var map = function(arr, fn) {
    const mappedArr = []
    
    arr.forEach((el, idx) => {
        mappedArr.push(fn(el, idx));
    })
    
    return mappedArr;
};

 

새로운 배열 mappedArr를 생성한 뒤, arr를 순회하며 각각의 원소와 인덱스값을 fn 함수에 넣는다. 이후 매번 반환된 값을 mappedArr에 넣고 순환이 종료되면 반환시킨다.

문제

Given an integer array arr and a filtering function fn, return a filtered array filteredArr.

The fn function takes one or two arguments:

arr[i] - number from the arr
i - index of arr[i]
filteredArr should only contain the elements from the arr for which the expression fn(arr[i], i) evaluates to a truthy value. A truthy value is a value where Boolean(value) returns true.

Please solve it without the built-in Array.filter method.

 

예제

arr, fn이 주어지면 arr의 각 원소를 fn 함수에 넣은 뒤 반환값이 True일 경우에만 Output 배열에 추가시킨다.

 

fn 함수에서 두 개의 파라미터를 필요로 할 땐, 첫 번째 인자로 arr의 각 원소를, 두 번째 인자로 각 원소의 인덱스 번호 i를 넣는다. 위 예제의 경우 인덱스 번호가 0인 경우에만 Output 배열에 추가된다.

 

0과 같은 Falsy한 값도 함수에서 걸러져야 한다. arr의 원소들 중 -1의 경우, plusOne 함수에 들어갔을 때 return 값이 0이 되어 Output 배열에 추가되지 않는다.

 

 

코드

/**
 * @param {number[]} arr
 * @param {Function} fn
 * @return {number[]}
 */
var filter = function(arr, fn) {
    const filteredArr = [];
    
    for (let i = 0; i < arr.length; i++) {
        if (fn(arr[i], i)) {
            filteredArr.push(arr[i]);
        }
    }
    
    return filteredArr;
};

arr에 대해 순회하면서 fn 함수에 원소와 인덱스값을 넣고 반환값을 확인한다. 만약 반환값이 True이면 filteredArr에 추가하고, 반환값이 False이면 추가하지 않는다.

문제

Given an array of functions [f1, f2, f3, ..., fn], return a new function fn that is the function composition of the array of functions.
The function composition of [f(x), g(x), h(x)] is fn(x) = f(g(h(x))).
The function composition of an empty list of functions is the identity function f(x) = x.
You may assume each function in the array accepts one integer as input and returns one integer as output.

 

예제

functions 배열에서 역순으로 함수들에 x을 넣어 나온 값을 x로 갱신시킨다.

 

마찬가지로 역순으로 함수들에 x를 삽입 후 나온 값으로 갱신시킨다.

 

functions 배열이 비어있을 경우, 정답은 항상 x이다.

 

 

코드

/**
 * @param {Function[]} functions
 * @return {Function}
 */
var compose = function(functions) {
    return function(x) {
        for (let i = functions.length - 1; i >= 0; i--) {
            x = functions[i](x);
        }
        
        return x;
    }
};

/**
 * const fn = compose([x => x + 1, x => 2 * x])
 * fn(4) // 9
 */

함수들이 들어있는 functions 배열을 역순으로 순회하며 x값을 넣은 후 반환된 값으로 x를 업데이트한다.

모든 함수를 순회하게 되면 문제에서 요구하는 값을 계산할 수 있다.

문제

Given an integer array nums, a reducer function fn, and an initial value init, return the final result obtained by executing the fn function on each element of the array, sequentially, passing in the return value from the calculation on the preceding element.

This result is achieved through the following operations: val = fn(init, nums[0]), val = fn(val, nums[1]), val = fn(val, nums[2]), ... until every element in the array has been processed. The ultimate value of val is then returned.

If the length of the array is 0, the function should return init.

Please solve it without using the built-in Array.reduce method.

 

예제

초기값과 숫자들, 그리고 함수가 주어지면 Array.reduce처럼 누적값과 숫자가 함수 내에서 연산된 뒤 반환된 값을 누적값으로 업데이트한다.

위 예제의 경우 먼저 fn 함수에 의해 초기값과 num[0]이 더해져 나온 값인 1이 누적값으로 업데이트되고,

그 누적값과 num[1]이 더해져 나온 값인 3이 누적값으로 업데이트되는 방식으로 nums 배열을 모두 순회할 때까지 진행된다.

 

위 예제도 예제 1과 같은 방식이지만, fn 함수 내부 연산이 curr의 제곱값을 더하는 점에서 다르다.

 

nums가 빈 배열일 경우, 정답은 항상 초기값이다.

 

 

코드

/**
 * @param {number[]} nums
 * @param {Function} fn
 * @param {number} init
 * @return {number}
 */
var reduce = function(nums, fn, init) {
    let value = init;
    for (let num of nums) {
        value = fn(value, num);
    }
    
    return value;
};

 

먼저 누적값을 담을 변수 value을 선언하고 초기값인 init으로 초기화한다.

이후 nums 배열을 순회하면서 value값과 num을 fn 함수에 넣고 반환된 값으로 value를 업데이트해준다.

마지막으로 value를 반환해주면 문제에서 요구했던 함수를 구현할 수 있다!

'Algorithm' 카테고리의 다른 글

[LeetCode] 2634. Filter Elements from Array  (0) 2024.01.22
[LeetCode] 2629. Function Composition  (0) 2024.01.21
[LeetCode] 2621. Sleep  (0) 2024.01.19
[LeetCode] 2620. Counter  (0) 2024.01.19
[LeetCode] 2619. Array Prototype Last  (0) 2024.01.15

+ Recent posts