문제 이해하기
첫 번째 인수로 문자열 배열 arr을, 두 번째 인수로 특수 문자 배열 starters를 받는 JavaScript 함수를 작성해야 합니다.
starters 배열에는 주석을 시작할 수 있는 문자들이 담겨 있습니다. 작성할 함수는 배열 arr의 각 문자열을 순회하면서 주석에 해당하는 부분을 모두 제거한 새로운 배열을 반환해야 합니다.
입력 예시
예를 들어 함수에 다음과 같은 입력이 주어졌다고 가정해 보겠습니다.
const arr = [ 'red, green !blue', 'jasmine, #pink, cyan' ]; const starters = ['!', '#'];
이 경우 기대하는 출력 결과는 다음과 같습니다.
const output = [ 'red, green', 'jasmine,' ];
'red, green !blue'에서는 느낌표(!) 이후의 'blue'가 주석으로 처리되어 제거되고, 'jasmine, #pink, cyan'에서는 샵(#) 이후의 내용이 모두 잘려나간 것을 확인할 수 있습니다.
해결 접근 방식
이 문제는 각 문자열을 한 글자씩 순회하면서 상태 플래그를 활용하면 깔끔하게 해결할 수 있습니다. 핵심 로직은 다음과 같습니다.
- 현재 문자가
starters배열에 포함되어 있다면, 해당 지점부터 주석이 시작된 것으로 판단하고 플래그를false로 설정합니다. - 주석이 시작되기 직전 문자열 끝에 남아 있는 불필요한 공백은 정규표현식
/\s+$/을 사용해 제거합니다. - 줄바꿈 문자(
\n)를 만나면 주석 상태를 초기화하여(플래그를true로 복원) 이후 문자를 다시 결과에 포함시킵니다. - 주석 상태가 아닐 때만 현재 문자를 결과 문자열에 추가합니다.
구현 코드
위 로직을 바탕으로 작성한 전체 코드는 다음과 같습니다.
const arr = [
'red, green !blue',
'jasmine, #pink, cyan'
];
const starters = ['!', '#'];
const removeComments = (arr = [], starters = []) => {
const res = [];
for (let i = 0; i < arr.length; i++) {
let str = '';
let flag = true;
for (let x of arr[i]) {
if (starters.includes(x)) {
flag = false;
str = str.replace(/\s+$/, '');
} else if (x === '\n') {
flag = true;
}
if (flag) str += x;
}
res.push(str);
}
return res;
};
console.log(removeComments(arr, starters));실행 결과
코드를 실행하면 콘솔에 다음과 같은 출력이 나타납니다.
[ 'red, green', 'jasmine,' ]
결과를 보면 각 문자열에서 주석 시작 문자(!, #) 이후의 내용과 함께 바로 앞의 공백까지 깔끔하게 제거된 것을 확인할 수 있습니다. 이 방식은 시간 복잡도 O(n × m)(n은 문자열 개수, m은 평균 문자열 길이)로 동작하며, 줄 단위 주석 처리가 필요한 설정 파일 파서나 간단한 템플릿 엔진을 만들 때 유용하게 활용할 수 있습니다.