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

JavaScript로 인코딩된 문자열을 디코딩하는 함수 구현하기

문제 이해하기

인코딩된 문자열이 주어졌을 때, 이를 처리하여 디코딩된 문자열을 반환하는 함수를 작성해야 합니다.

인코딩 규칙은 다음과 같습니다.

n[encodedString] — 대괄호 안의 문자열(encodedString)이 정확히 n번 반복됨

여기서 n은 항상 양의 정수라고 보장됩니다.

또한 입력 문자열은 항상 유효하다고 가정할 수 있습니다. 즉, 불필요한 공백이 없고 대괄호가 올바른 형태로 짝을 이루고 있다는 의미입니다.

예시

입력이 다음과 같다면,

const str = "3[a]2[bc]";

출력은 다음과 같아야 합니다.

"aaabcbc"

'3[a]'는 'a'가 세 번 반복된 'aaa'로, '2[bc]'는 'bc'가 두 번 반복된 'bcbc'로 디코딩되어 최종적으로 'aaabcbc'가 됩니다.

풀이 코드

정규 표현식과 String.prototype.replace() 메서드를 활용하면 간결하게 해결할 수 있습니다.

const str = "3[a]2[bc]";

// 문자열 내 모든 n[패턴] 조각을 반복된 문자열로 치환하는 헬퍼 함수
const helper = (str = '') => {
  return str.replace(/(\d+\[\w+\])/gi, item => {
    let match = /(\d+)\[(\w+)\]/.exec(item);
    let repeat = parseInt(match[1]);
    let pattern = match[2];
    let result = "";
    while(repeat-- > 0) {
      result += pattern;
    }
    return result;
  });
};

// 더 이상 디코딩할 패턴이 없을 때까지 반복
const decodeString = function(str) {
  while(/\d+\[\w+\]/gi.test(str)) {
    str = helper(str);
  }
  return str;
};
console.log(decodeString(str));

코드 설명

동작 방식을 단계별로 살펴보면 다음과 같습니다.

  • helper 함수: 정규식 /(\d+\[\w+\])/gi로 '숫자 + 대괄호' 형태의 조각을 찾아내고, 각 조각에서 반복 횟수(n)와 패턴을 추출한 뒤, 패턴을 n번 이어 붙인 문자열로 교체합니다.
  • decodeString 함수: 문자열에 아직 디코딩할 패턴이 남아 있는 동안 helper를 계속 호출합니다. 이러한 반복 처리 덕분에 '3[a2[c]]'처럼 중첩된 인코딩도 안쪽부터 차례대로 풀어낼 수 있습니다.

출력 결과

콘솔에는 다음과 같이 출력됩니다.

aaabcbc