문제 정의
두 개의 문자열을 인수로 받는 JavaScript 함수를 작성해야 합니다. 이 함수의 목표는 두 문자열 중 어느 한쪽에만 존재하고 양쪽에 공통으로 나타나지 않는 문자들만 모아 새로운 문자열로 반환하는 것입니다.
예를 들어, 첫 번째 문자열에만 있는 문자와 두 번째 문자열에만 있는 문자를 모두 수집하되, 두 문자열 모두에 등장하는 문자는 제외해야 합니다.
해결 접근 방식
가장 직관적인 방법은 다음과 같습니다.
1. 첫 번째 문자열을 순회하면서 각 문자가 두 번째 문자열에 존재하는지 확인합니다.
2. 존재하지 않는 문자라면 결과 배열에 추가합니다.
3. 같은 방식으로 두 번째 문자열도 순회하며 첫 번째 문자열에 없는 문자를 추가합니다.
4. 마지막으로 결과 배열을 하나의 문자열로 합쳐 반환합니다.
문자열 포함 여부는 includes() 메서드를 활용하면 간단하게 처리할 수 있습니다.
예제 코드
다음은 위 접근 방식을 구현한 전체 코드입니다.
const str1 = "xyab";
const str2 = "xzca";
const findUncommon = (str1 = '', str2 = '') => {
const res = [];
// str1에는 있지만 str2에는 없는 문자 추출
for (let i = 0; i < str1.length; i++) {
if (!(str2.includes(str1[i]))) {
res.push(str1[i]);
}
}
// str2에는 있지만 str1에는 없는 문자 추출
for (let i = 0; i < str2.length; i++) {
if (!(str1.includes(str2[i]))) {
res.push(str2[i]);
}
}
return res.join("");
};
console.log(findUncommon(str1, str2));
출력 결과
ybzc
코드 동작 원리
위 예제에서 str1은 "xyab", str2는 "xzca"입니다.
- 'x'와 'a'는 두 문자열 모두에 존재하므로 제외됩니다.
- 'y'와 'b'는 첫 번째 문자열에만 있으므로 결과에 포함됩니다.
- 'z'와 'c'는 두 번째 문자열에만 있으므로 결과에 포함됩니다.
따라서 최종 출력은 ybzc가 됩니다.
시간 복잡도 참고 사항
이 구현은 이중 반복문처럼 보이지만 실제로는 includes() 내부에서 선형 탐색이 발생하므로 시간 복잡도는 O(n×m)입니다. 문자열이 매우 길다면 Set 객체를 활용해 각 문자열의 문자를 미리 저장하면 조회 속도를 O(1)로 개선할 수 있습니다.