스트링 디코드 문제에서 망하고, 43분 후 복수에 성공한 이야기 (feat. 중첩 괄호도 처리함)
## 🔧 배경
얼마 전 기술 면접을 보다가 `decodeString` 문제를 받았습니다.
알고리즘 공부는 주로 BFS, DFS 쪽만 하던 터라, 문자열 파싱 문제에서 완전히 발목 잡혔습니다.
거기다 라이브 코딩. 제한 시간 30분.
당연히… 못 풀었죠. 멘탈까지 디코딩당한 날이었습니다.
---
## 🔥 복수의 시작
면접이 끝난 뒤에도 이 문제는 계속 머릿속을 맴돌았습니다.
“내가 이걸 못 풀었다고? 진짜?”
그 순간부터 **마음속의 디버거**가 켜졌고, 라이브 코딩에서 시도했던 방식에서 출발해 다시 파기 시작했습니다.
스택도 쓰지 않았습니다.
재귀도 쓰지 않았습니다.
그냥 제 방식대로, 끈질기게 문자열을 조작하면서 풀었습니다.
**걸린 시간: 추가 43분.**
---
## 🧠 접근 방식 요약
- `[`와 `]`를 찾는다. 가장 안쪽 괄호부터 시작.
- 그 안의 문자열을 꺼내고, 반복 횟수를 계산한다.
- 원래 문자열 배열을 `splice`로 조작해서 새로운 문자열을 삽입한다.
- 그리고… **처음부터 다시 돌린다.**
- 이걸 괄호가 다 없어질 때까지 반복한다.
사실상 **재귀를 흉내 내는 루프 기반 수동 파서**입니다.
---
## ✅ 최종 코드 (with 주석)
```javascript
/**
* @param {string} s
* @return {string}
*/
var decodeString = function(s) {
const strArr = s.split('');
let startIndex = -1;
let endIndex = -1;
for(let i = 0; i < strArr.length; i++) {
if(strArr[i] === '['){
startIndex = i;
}
else if(strArr[i] === ']'){
endIndex = i;
}
// 가장 안쪽에서부터 괄호 풀기
if(startIndex >= 0 && endIndex >= 0 && endIndex > startIndex){
const addedStr = strArr.slice(startIndex + 1, endIndex).join('');
let newStr = '';
let startNumIndex = 0;
// 반복해야하는 숫자 구하기
for(let j = startIndex - 1; j >= 0; j--){
if(strArr[j] === '' || isNaN(Number(strArr[j]))){
startNumIndex = j + 1;
break;
}
}
const repeatNumString = strArr.slice(startNumIndex, startIndex).join('');
const repeatNum = Number(repeatNumString);
for(let j = 0; j < repeatNum; j++){
newStr += addedStr;
}
// 문자열 치환
strArr.splice(startNumIndex, endIndex - startNumIndex + 1, newStr);
// 상태 초기화 후 처음부터 다시 순회
startIndex = -1;
endIndex = -1;
i = 0;
}
}
return strArr.join('');
};
```
Comments
Post a Comment