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

JavaScript 배열에서 회문을 형성하는 고유 단어 쌍 찾기

문제 정의

중복 없이 고유한 단어들로 구성된 배열을 입력으로 받는 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개의 코드 유닛으로 표현되는 문자가 포함된 경우에도 안전하게 처리할 수 있습니다.