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

JavaScript 문자열 배열에서 주석 제거하는 방법

문제 이해하기

첫 번째 인수로 문자열 배열 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은 평균 문자열 길이)로 동작하며, 줄 단위 주석 처리가 필요한 설정 파일 파서나 간단한 템플릿 엔진을 만들 때 유용하게 활용할 수 있습니다.