이번 글에서는 길이가 오름차순으로 정렬된 문자열 배열을 입력받아, 인접한 두 문자열 쌍마다 뒤의 문자열이 앞의 문자열에 글자 하나를 맨 앞이나 맨 뒤에 추가하여 만들어질 수 있는지 판별하는 JavaScript 함수를 작성해 보겠습니다.
문제 이해하기
함수는 다음 조건을 만족할 때 true를 반환해야 합니다.
- 배열 내 모든 인접한 문자열 쌍에 대해 검사를 진행합니다.
- 두 번째 문자열은 반드시 첫 번째 문자열보다 길이가 1만큼 길어야 합니다.
- 두 번째 문자열은 첫 번째 문자열의 앞 또는 뒤에 알파벳 한 글자를 덧붙인 형태여야 합니다.
예를 들어 다음과 같은 배열이 주어졌을 때 −
const arr = ["c", "ca", "can", "acan", "acane", "dacane"];
각 문자열은 이전 문자열에 글자를 하나씩 추가하며 만들어지므로, 함수는 true를 반환해야 합니다.
구현 로직
핵심 아이디어는 다음과 같습니다.
- 배열을 순회하면서 현재 문자열과 다음 문자열을 비교합니다.
- 다음 문자열이
새 글자 + 이전 문자열형태(앞에 추가된 경우)인지 확인합니다. - 그렇지 않다면
이전 문자열 + 새 글자형태(뒤에 추가된 경우)인지 확인합니다. - 두 조건 중 어느 것도 만족하지 않으면 즉시
false를 반환하고, 끝까지 통과하면true를 반환합니다.
코드 구현
실제 코드는 다음과 같습니다 −
const arr = ["c", "ca", "can", "acan", "acane", "dacane"];
const isProgressive = arr => {
// 인접한 문자열 쌍을 순서대로 검사
for(let i = 0; i < arr.length - 1; i++){
const nextLength = arr[i+1].length;
// 앞에 글자가 추가된 경우 또는 뒤에 글자가 추가된 경우
if(arr[i+1] === arr[i+1][0] + arr[i]
|| arr[i+1] === arr[i] + arr[i+1][nextLength - 1]){
continue;
};
// 조건을 만족하지 않으면 false 반환
return false;
};
// 모든 쌍이 조건을 통과하면 true 반환
return true;
};
console.log(isProgressive(arr));실행 결과
콘솔에 출력되는 결과는 다음과 같습니다 −
true
마무리
이처럼 문자열 비교와 간단한 반복문만으로도 배열이 점진적으로 형성되는지 손쉽게 검증할 수 있습니다. 시간 복잡도는 배열의 길이를 n이라 할 때 O(n)으로 효율적이며, 문자열 연결 연산이 각 단계에서 상수 시간에 처리되므로 실무에서도 충분히 활용할 수 있는 패턴입니다.