문제 정의
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²)입니다.
이 방식은 간단하고 직관적이며, 배열 요소 개수가 많지 않은 경우 효율적으로 동작합니다.