문제 정의
문자열 str과 하나의 문자 char를 입력으로 받는 JavaScript 함수를 작성해야 합니다. 함수는 원본 문자열에서 지정한 문자가 등장하는 각 위치의 바로 다음 문자를 찾아, 이들을 하나로 이어 붙인 새로운 문자열을 반환합니다. 만약 해당 문자가 문자열의 마지막에 위치해 다음 문자가 없다면, 그 위치는 자연스럽게 건너뛰게 됩니다.
예를 들어 문자열 'this is a string'에서 문자 'i'를 찾으면, 각 'i' 바로 뒤에 오는 문자들은 's', 's', 'n'이므로 최종 결과는 'ssn'이 되어야 합니다.
구현 예제
다음은 기본적인 for 반복문을 활용한 구현 코드입니다.
const str = 'this is a string';
const letter = 'i';
const findNextString = (str = '', letter = '') => {
let res = '';
for(let i = 0; i < str.length; i++){
const el = str[i];
const next = str[i + 1];
if(letter === el && next){
res += next;
};
};
return res;
};
console.log(findNextString(str, letter));
코드 동작 방식
코드의 흐름을 단계별로 살펴보면 다음과 같습니다.
- 결과를 담을 빈 문자열
res를 먼저 선언합니다. for반복문으로 문자열의 처음부터 끝까지 한 글자씩 순회합니다.- 현재 문자
el이 찾고자 하는letter와 일치하는지 확인합니다. - 일치할 경우, 그 다음 위치의 문자
next가 실제로 존재하는지 검사한 뒤 존재한다면res에 추가합니다. 이 조건 덕분에 문자열 맨 끝의 문자 뒤를 참조해 발생하는undefined문제를 방지할 수 있습니다. - 모든 순회가 끝나면 완성된 문자열
res를 반환합니다.
출력 결과
ssn
입력 문자열 'this is a string'에는 'i'가 세 번 등장하며, 각각의 바로 다음 문자가 순서대로 's', 's', 'n'이므로 최종적으로 'ssn'이 출력됩니다.
대안: 정규표현식으로 더 간결하게
같은 로직은 정규표현식을 사용하면 훨씬 짧은 코드로 구현할 수 있습니다.
const findNextString = (str = '', letter = '') => {
const escaped = letter.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // 특수문자 처리
const regex = new RegExp(escaped + '(.)', 'g');
return [...str.matchAll(regex)].map(match => match[1]).join('');
};
console.log(findNextString('this is a string', 'i')); // ssn이 방식은 찾고자 하는 문자 뒤에 임의의 한 문자를 캡처하는 패턴을 만들어, 일치하는 모든 결과에서 캡처된 문자만 추출한 후 하나의 문자열로 합칩니다. 다만 검색 대상 문자가 정규표현식 특수문자일 수 있으므로, 안전한 사용을 위해 이스케이프 처리를 추가하는 것이 좋습니다.