문제 정의
중복 없이 고유한 단어들로 구성된 배열을 입력으로 받는 JavaScript 함수를 작성해야 합니다.
이 함수의 역할은 배열 안의 두 단어를 이어 붙였을 때 회문(palindrome), 즉 앞뒤로 읽었을 때 같은 문자열이 되는 모든 인덱스 쌍 [i, j]를 찾아 배열 형태로 반환하는 것입니다. 단, i와 j는 서로 달라야 하며, arr[i] 뒤에 arr[j]를 연결한 결과가 회문일 때 해당 쌍을 결과에 포함합니다.
접근 방법
가장 직관적인 풀이는 브루트포스(완전 탐색)입니다. 가능한 모든 순서쌍 (i, j)에 대해 두 단어를 연결한 문자열을 만들고, 그 문자열을 뒤집은 값과 비교하여 일치 여부를 확인하면 됩니다. 시간 복잡도는 O(n² × m)으로, n은 단어 개수, m은 평균 단어 길이에 해당합니다.
예시 코드
다음은 전체 구현 코드입니다 −
const arr = ["abcd", "dcba", "lls", "s", "sssll"];
const findPairs = (arr = []) => {
const res = [];
for ( let i = 0; i < arr.length; i++ ){
for ( let j = 0; j < arr.length; j++ ){
if (i !== j ) {
let k = `${arr[i]}${arr[j]}`;
let l = [...k].reverse().join('');
if (k === l)
res.push( [i, j] );
}
};
};
return res;
};
console.log(findPairs(arr));
출력 결과
[ [ 0, 1 ], [ 1, 0 ], [ 2, 4 ], [ 3, 2 ] ]
결과 해석
각 인덱스 쌍이 회문이 되는 이유는 다음과 같습니다.
- [0, 1]: "abcd" + "dcba" = "abcddcba" → 회문
- [1, 0]: "dcba" + "abcd" = "dcbaabcd" → 회문
- [2, 4]: "lls" + "sssll" = "llssssll" → 회문
- [3, 2]: "s" + "lls" = "slls" → 회문
코드에서는 [...k].reverse().join('')을 사용해 문자열을 뒤집습니다. 스프레드 연산자(...)로 문자열을 문자 배열로 변환한 뒤 reverse()를 적용하고 다시 join()으로 합치는 방식으로, 코드 포인트 단위로 동작하기 때문에 이모지처럼 2개의 코드 유닛으로 표현되는 문자가 포함된 경우에도 안전하게 처리할 수 있습니다.