문제 이해하기
인코딩된 문자열이 주어졌을 때, 이를 처리하여 디코딩된 문자열을 반환하는 함수를 작성해야 합니다.
인코딩 규칙은 다음과 같습니다.
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