Computer >> 컴퓨터 >  >> 프로그래밍 >> JavaScript

JavaScript로 배열을 두 부분으로 나누는 모든 경우의 수 구하기

문제 정의

JavaScript에서 최소 두 개 이상의 요소를 가진 문자열 배열을 입력받아, 해당 배열을 두 개의 비어 있지 않은 부분으로 나누는 모든 방법을 반환하는 함수를 작성해야 합니다.

예를 들어, 다음과 같은 배열이 주어졌을 때 −

["az", "toto", "picaro", "zone", "kiwi"]

가능한 모든 분할 결과는 다음과 같습니다 −

(az, toto picaro zone kiwi)(az toto, picaro zone kiwi)(az toto picaro, zone kiwi)(az toto picaro zone, kiwi)

해결 접근 방식

배열을 두 부분으로 나누는 경계점은 총 length - 1개입니다. 따라서 인덱스 1부터 배열 길이 직전까지 반복하면서, 각 위치를 기준으로 slice() 메서드를 사용해 앞부분과 뒷부분을 나눈 뒤 각각 하나의 문자열로 합쳐주면 됩니다.

예제 코드

다음은 위 로직을 구현한 전체 코드입니다 −

const arr = ["az", "toto", "picaro", "zone", "kiwi"];

const findAllPossibilities = (arr = []) => {
    let array;
    const res = [];
    for (let i = 1; i < arr.length; i++) {
        array = [];
        // 인덱스 i를 기준으로 앞부분을 하나의 문자열로 결합
        array.push(arr.slice(0, i).join(" "));
        // 나머지 뒷부분을 하나의 문자열로 결합
        array.push(arr.slice(i).join(" "));
        res.push(array);
    };
    return res;
};

console.log(findAllPossibilities(arr));

출력 결과

위 코드를 실행하면 콘솔에 다음과 같은 결과가 출력됩니다 −

[
  [ 'az', 'toto picaro zone kiwi' ],
  [ 'az toto', 'picaro zone kiwi' ],
  [ 'az toto picaro', 'zone kiwi' ],
  [ 'az toto picaro zone', 'kiwi' ]
]

코드 설명

  • 반복문: 분할 지점 i를 1부터 arr.length - 1까지 순회합니다. 이렇게 하면 양쪽 부분이 항상 최소 한 개 이상의 요소를 가지게 됩니다.
  • slice(0, i): 배열의 처음부터 인덱스 i 직전까지의 요소들을 추출한 후, join(" ")으로 공백을 기준으로 하나의 문자열로 병합합니다.
  • slice(i): 인덱스 i부터 배열 끝까지의 요소들을 추출하여 마찬가지로 문자열로 병합합니다.
  • 시간 복잡도: 분할 지점마다 slice와 join 연산이 수행되므로 전체 시간 복잡도는 O(n²)입니다.

이 방식은 간단하고 직관적이며, 배열 요소 개수가 많지 않은 경우 효율적으로 동작합니다.