부분 문자열이란 무엇인가
부분 문자열(Substring)은 한 문자열 안에 포함된 더 작은 문자열을 의미합니다. 예를 들어 'JavaScript'라는 문자열에서 'Script'는 부분 문자열입니다. 부분 문자열 찾기는 프로그래밍에서 문자열 검색, 데이터 필터링, 패턴 매칭 등의 작업에서 매우 흔히 사용됩니다.
자바스크립트에서는 여러 가지 방법으로 부분 문자열을 찾을 수 있습니다. 이번 글에서는 내장 메서드를 활용한 방법과 직접 반복문을 통해 구현하는 방식을 단계별로 소개하겠습니다.
방법 1: 내장 메서드 includes(), indexOf()
자바스크립트에는 문자열에서 부분 문자열을 쉽게 검색할 수 있는 내장 메서드가 존재합니다.
includes()
includes() 메서드는 문자열 내에서 특정 문자열의 존재 여부를 불리언(Boolean) 값으로 반환합니다.
const str = 'Hello, JavaScript';
console.log(str.includes('Java')); // true
console.log(str.includes('Python')); // false
indexOf()
indexOf() 메서드는 부분 문자열이 발견된 첫 번째 인덱스를 반환하고, 없으면 -1을 반환합니다.
const str = 'Hello, JavaScript';
console.log(str.indexOf('Java')); // 7
console.log(str.indexOf('Python')); // -1
장단점
- 장점: 코드가 간단하고 직관적입니다. 성능도 매우 빠릅니다.
- 단점: 복잡한 패턴이나 대규모 문자열 처리에는 제약이 있을 수 있습니다.
방법 2: 반복문을 이용한 직접 구현
직접 구현하는 방식은 원리적인 이해와 맞춤형 기능이 필요할 때 유용합니다.
function substringSearch(haystack, needle) {
for (let i = 0; i <= haystack.length - needle.length; i++) {
let found = true;
for (let j = 0; j < needle.length; j++) {
if (haystack[i + j] !== needle[j]) {
found = false;
break;
}
}
if (found) return i;
}
return -1;
}
console.log(substringSearch('Hello, JavaScript', 'Java')); // 7
console.log(substringSearch('Hello, JavaScript', 'Python')); // -1
작동 방식 설명
- 바깥쪽 반복문은 원본 문자열을 한 글자씩 이동하면서 검사합니다.
- 내부 반복문은 찾고자 하는 문자열의 각 글자를 비교합니다.
- 일치하지 않는 경우 즉시 다음 위치로 이동합니다.
장단점
- 장점: 로직을 정확히 이해할 수 있으며, 커스터마이징이 용이합니다.
- 단점: 코드가 길고, 내장 메서드보다는 성능이 떨어질 수 있습니다.
방법 3: 고급 알고리즘 (KMP 알고리즘)
복잡한 문자열 처리에 최적화된 알고리즘으로 KMP(Knuth-Morris-Pratt) 알고리즘이 있습니다. 이 글에서는 알고리즘의 세부 구현은 생략하고, 개념만 간략히 소개합니다.
KMP 알고리즘은 불필요한 문자열 비교를 최소화하여 선형 시간(O(n + m)) 안에 부분 문자열을 찾을 수 있도록 합니다. 실무에서 매우 긴 문자열이나 반복된 패턴을 검색할 때 사용됩니다.
각 방법의 성능 비교
방식 | 시간 복잡도 | 장점 | 단점 |
includes(), indexOf() | O(n) | 간단하고 빠름 | 복잡한 패턴은 처리 어려움 |
반복문 직접 구현 | O(n*m) | 구현 이해에 좋음 | 성능 저하 가능성 있음 |
KMP 알고리즘 | O(n + m) | 복잡한 패턴에 효율적 | 구현 난이도가 높음 |
일반적인 상황에서는 내장 메서드를 추천하며, 알고리즘 학습과 이해가 필요할 때 반복문 구현이나 KMP 알고리즘을 학습해보는 것이 좋습니다.
마무리 및 추천 자료
부분 문자열 찾기는 문자열 처리의 기본이며, 프로그래밍 전반에서 자주 사용됩니다. 이를 통해 자바스크립트의 문자열 관련 메서드 활용법과 반복문 구조, 알고리즘적 사고를 연습할 수 있습니다.
다음은 알고리즘 문제 해결 능력을 높이기 위한 무료 자료입니다:
꾸준히 문제를 연습하고 다양한 접근법을 시도해보는 것이 프로그래밍 실력을 향상시키는 가장 좋은 방법입니다.