https://leetcode.com/problems/backspace-string-compare/description/
문제의 핵심 : stack의 활용
풀이시간 18m
런타임 1ms
var backspaceCompare = function (s, t) {
const stackS = []
const stackT = []
for (const char of s) {
if (char === "#") {
stackS.pop()
} else {
stackS.push(char)
}
}
for (const char of t) {
if (char === "#") {
stackT.pop()
} else {
stackT.push(char)
}
}
return JSON.stringify(stackS) == JSON.stringify(stackT)
};
stack으로 풀어야한다는 걸 보는 순간 딱 알아차렸어야했는데!
두개를 비교해야하니 이중 for문인가? 하고 있었다.
일단 무식하게 풀어서 테케 통과한 뒤에 개선하기로 했다
["a","c"] === ["a","c"] 비교는 당연히 false인데 잠깐 헤맸다...
중첩 for문은 아니지만 동일한 로직의 for문을 두개 썼다는 점과
stringfy로 비교를 한다는 점이 마음에 걸리네
배열의 비교가 왜 당연히 false인가? 📌 아래 글 참조
[자료구조] 원시타입과 참조타입의 참조변경 과정 (object는 왜 같지 않은가?)
✅ 긍정적인 점
# 문자를 처리하기 위해 스택을 활용한 접근은 매우 적절합니다. 백스페이스의 동작을 스택으로 직관적으로 구현해 문제를 정확히 해결했어요.🛠 개선 포인트 (면접자 기준 피드백)
s와 t 각각에 대해 거의 동일한 스택 처리 로직이 반복되고 있어, 함수로 추출하면 더 깔끔하고 재사용 가능하게 만들 수 있습니다.JSON.stringify()로 배열을 문자열로 변환 후 비교하는 방식은 작동은 하지만, 문자열 변환 비용이 추가되고 의도 전달이 덜 명확할 수 있습니다. join('')을 사용하는 편이 더 직접적이고 효율적입니다.✅ 왜 join('')을 쓰는가?
배열은 참조 타입이라 === 비교로는 내용을 비교할 수 없습니다.
JSON.stringify(arr)는 문자열화에 시간이 더 들고, 요소 순서에 민감하며 의미가 불명확할 수 있습니다.
join('')은 문자열 배열을 단일 문자열로 변환해서 비교할 수 있도록 하며, 간단하고 빠릅니다.
💡 더 나은 코드:
function process(str) {
const stack = [];
for (const char of str) {
char === '#' ? stack.pop() : stack.push(char);
}
return stack.join('');
}
var backspaceCompare = function(s, t) {
return process(s) === process(t);
};
✅ 면접관 한 마디 (총평)
스택의 개념을 정확히 이해하고 문제에 잘 적용한 점은 높은 평가를 받을 수 있습니다. 다만, 실무나 유지보수 측면에서 중복 로직 제거, 더 직관적인 비교 방식 등은 코드 품질 향상을 위해 고려해야 합니다. 지금처럼 기본 개념을 확실히 잡은 상태에서 점점 더 깔끔하고 추상화된 코드로 발전시켜 나간다면 실무에서도 충분히 신뢰받는 개발자가 될 수 있습니다.
런타임 0ms
const getStack = function (arr) {
const stack = []
for (const char of arr) {
if (char === "#") {
stack.pop()
} else {
stack.push(char)
}
}
return stack
}
var backspaceCompare = function (s, t) {
// const stackS = getStack(s)
// const stackT = getStack(t)
// 여기서 변수를 만들어서 넣으면 2ms가 추가로 소요된다. 별차이없긴 함
return getStack(s).join('') === getStack(t).join('')
};
스택으로 푸니까 금방 푸는구나.
문제를 보면 먼저 어떤 자료구조가 적합한가?를 먼저 생각해보자.