DEV

LeetCode #2629쉬움

2629. 함수 합성

2629. Function Composition

Algorithm
해설 읽기 3
javascript

문제 설명

문제 설명: 함수들의 배열 [f1, f2, f3, ..., fn]이 주어졌을 때, 이 함수들의 배열을 합성한 새로운 함수 fn을 반환하세요. [f(x), g(x), h(x)]의 함수 합성은 fn(x) = f(g(h(x)))입니다. 함수 목록이 비어 있을 때, 함수 합성은 항등 함수 f(x) = x입니다. 각 배열의 함수는 하나의 정수를 입력으로 받아 하나의 정수를 출력하는 것으로 가정합니다.

예제

예제 1

입력: functions = [x => x + 1, x => x * x, x => 2 * x], x = 4
출력: 65
설명: 오른쪽에서 왼쪽으로 평가합니다...

예제 2

입력: functions = [x => 10 * x, x => 10 * x, x => 10 * x], x = 1
출력: 1000
설명: 오른쪽에서 왼쪽으로 평가합니다...

예제 3

입력: functions = [], x = 42
출력: 42
설명: 함수 0개의 합성은 항등 함수입니다.

예제 4

입력: functions = [x => x + 1, x => x * x, x => 2 * x], x = 4
출력: 65
설명: 오른쪽에서 왼쪽으로 평가합니다...

예제 5

입력: functions = [x => 10 * x, x => 10 * x, x => 10 * x], x = 1
출력: 1000
설명: 오른쪽에서 왼쪽으로 평가합니다...

예제 6

입력: functions = [], x = 42
출력: 42
설명: 함수 0개의 합성은 항등 함수입니다.

⚠️제약 조건

  • -1000 <= x <= 1000

  • 0 <= functions.length <= 1000

  • 모든 함수는 단일 정수를 받아들이고 반환합니다

해결 방법

🎯접근 방식

이 문제는 함수 배열을 오른쪽에서 왼쪽으로 순차적으로 적용하여 함수 합성을 구현하는 문제입니다. 알고리즘은 단순히 반복문을 사용하여 배열의 끝에서부터 시작하여 각 함수를 입력 값에 적용합니다. 핵심 아이디어는 함수 배열이 비어 있을 경우 항등 함수로 처리하고, 그렇지 않으면 배열의 마지막 함수부터 차례로 입력 값에 적용하여 최종 결과를 반환하는 것입니다.

솔루션 코드

복잡도 분석

시간 복잡도:O(n)
공간 복잡도:O(1)

💡상세 설명

이 문제는 함수들의 배열을 받아서 그 함수들을 차례대로 합성하는 새로운 함수를 반환하는 문제입니다. 함수 합성은 주어진 함수들을 오른쪽에서 왼쪽으로 차례대로 적용하는 것을 의미합니다. 예를 들어, 함수 배열 [f(x), g(x), h(x)]가 주어졌다면, 합성된 함수는 f(g(h(x)))가 됩니다. 빈 배열이 주어질 경우, 입력값을 그대로 반환하는 항등 함수가 됩니다.

이제 주어진 코드에 대해 자세히 살펴보겠습니다.

1. 알고리즘의 핵심 아이디어

주어진 함수 배열을 오른쪽에서 왼쪽으로 순회하면서 각 함수에 입력값을 적용하여 최종 결과를 얻습니다. 이때, 함수가 없으면 입력값을 그대로 반환합니다.

2. 코드의 주요 로직 설명

var compose = function(functions) {
    return function(x) {
        if (functions.length <= 0) return x;
        for(let i = functions.length - 1; i >= 0; i--) {
            x = functions[i](x);
        }
        return x;
    }
};
  • compose 함수는 함수 배열 functions를 입력받아 새로운 함수를 반환합니다.
  • 반환된 함수는 입력값 x를 받아 순차적으로 함수들을 적용하여 최종 결과를 반환합니다.

3. 각 단계별 동작 과정

  1. 빈 배열 처리:

    • if (functions.length <= 0) return x; 부분은 함수 배열이 비어 있을 경우 입력값 x를 그대로 반환합니다. 이는 항등 함수의 역할을 합니다.
  2. 함수 합성:

    • for 루프는 배열의 마지막 함수부터 첫 번째 함수까지 역순으로 순회합니다.
    • x = functions[i](x);는 현재 함수 functions[i]x에 적용하고, 그 결과를 다시 x에 저장합니다. 이는 다음 함수의 입력값으로 사용됩니다.
  3. 결과 반환:

    • 모든 함수가 적용된 후 최종 결과 x를 반환합니다.

4. 핵심 변수들의 역할

  • functions: 합성할 함수들의 배열입니다.
  • x: 함수들이 차례로 적용되는 현재 값입니다. 초기에는 외부에서 주어진 입력값이며, 각 함수가 적용될 때마다 업데이트됩니다.
  • i: 함수 배열을 역순으로 순회하기 위한 인덱스입니다.

5. 왜 이 방법이 효과적인지

  • 단순함: 함수 배열을 역순으로 순회하면서 각 함수에 값을 적용하는 방식은 함수 합성의 정의에 충실합니다.
  • 유연함: 함수 배열이 비어 있을 때도 항등 함수를 반환하여 예외 상황을 깔끔하게 처리할 수 있습니다.
  • 확장성: 함수 배열의 크기에 관계없이 동일한 방식으로 처리할 수 있어 다양한 입력에 대해 유연하게 대응할 수 있습니다.

이 코드는 함수형 프로그래밍의 기본 개념인 함수 합성을 명확하게 구현하며, 주어진 문제를 효과적으로 해결합니다. 초보자도 이해하기 쉽게 함수의 순서와 적용 과정을 명확히 설명하고 있습니다.

관련 문제