
문제의 핵심 : 점수와 연산자를 구분하여 처리
var calPoints = function (operations) {
const stack = []
for (op of operations) {
if (op === "C") {
console.log("C, stack의 마지막 요소를 지웁니다")
stack.pop()
} else if (op === "D") {
console.log("D, stack의 마지막 요소에 2를 곱한 값을 넣습니다")
stack.push(stack[stack.length - 1] * 2)
} else if (op === "+") {
console.log("+, stack의 마지막 두 요소를 더한 값을 추가합니다")
stack.push(stack[stack.length - 1] + stack[stack.length - 2])
} else {
console.log("숫자입니다. 추가", op)
stack.push(parseInt(op))
}
}
return stack.reduce((acc, cur) => acc + cur, 0)
};
좋습니다! 전체적으로 로직은 문제 요구사항에 맞게 잘 작성되었고, 실제로 통과도 잘 될 코드입니다. 다만, 면접관의 시각에서 본다면 기본 구현력은 확인되었지만, 몇 가지 개선 포인트와 코드 스타일에 대한 피드백을 드릴 수 있습니다.
✅ 긍정적인 점
- 요구사항 정확히 반영: "C", "D", "+", 숫자 처리 모두 문제의 규칙에 맞게 잘 구현됨.
- 스택 자료구조 사용 적절: 문제 자체가 스택을 활용해야 자연스럽게 풀리는 문제인데, 제대로 적용함.
- 가독성: 코드가 간결하고 if-else 블록이 명확하게 나눠져 있어 이해하기 쉬움.
- 테스트용 console.log 활용: 디버깅 흔적이 남아 있어 문제 풀이 과정이 보임.
🛠 개선 포인트 (면접자 기준 피드백)
- 1. ❗️for (op of operations) → 변수 선언 누락
for (op of operations)
→ op에 let 또는 const 선언이 빠졌습니다. 이건 의외로 감점 포인트가 될 수 있습니다.
브라우저에선 작동하지만, 엄격한 모드(strict mode)나 ESLint 적용 환경에서는 에러로 간주됩니다.- 2. 🔍 console.log는 문제 풀이 후 삭제
면접 상황에서는 console.log는 디버깅 도구로 쓰였다는 걸 설명하고,
최종 제출 코드에는 지우는 것이 보통입니다. 또는 주석으로 남겨둘 수는 있습니다.- 3. 🧠 더 깔끔한 의사 표현 가능 (가독성 향상)
예를 들어 "+" 처리 부분에서 변수 도입으로 의도를 명확히 할 수 있습니다.
장점: 의미 있는 이름으로 디버깅, 협업 시 빠른 이해 가능.else if (op === "+") { const last = stack[stack.length - 1] const secondLast = stack[stack.length - 2] stack.push(last + secondLast) }
- 💡 코드 구조 정리 (Switch문 고려 가능)
if-else 체인이 적절하긴 하지만, 명확한 매칭 케이스이므로 switch문도 선택지일 수 있습니다.switch (op) { case "C": stack.pop() break case "D": stack.push(stack[stack.length - 1] * 2) break case "+": stack.push(stack[stack.length - 1] + stack[stack.length - 2]) break default: stack.push(parseInt(op)) }
✅ 면접관 한 마디 (총평)
"기본적인 구현 능력은 잘 보여주셨습니다. 스택을 적절히 활용하셨고, 문제 요구사항을 정확히 반영하셨네요. 다만 실무에서는 let, const 누락 같은 사소한 버그가 실제 장애로 이어질 수 있으니 항상 변수 선언을 명확히 해주시는 게 좋습니다. 또한 디버깅 코드 정리나 변수명을 조금 더 명확히 해주면, 협업 관점에서도 더 좋은 코드가 될 수 있을 것 같습니다."
var calPoints = function (operations) {
const stack = []
for (op of operations) {
switch (op) {
case "C":
stack.pop()
break
//console.log("C, stack의 마지막 요소를 지웁니다")
case "D":
stack.push(stack[stack.length - 1] * 2)
break
//console.log("D, stack의 마지막 요소에 2를 곱한 값을 넣습니다")
case "+":
stack.push(stack[stack.length - 1] + stack[stack.length - 2])
break
//console.log("+, stack의 마지막 두 요소를 더한 값을 추가합니다")
default:
stack.push(parseInt(op))
//console.log("숫자입니다. 추가", op)
}
}
return stack.reduce((acc, cur) => acc + cur, 0)
};
앞에서 stack 구조를 활용한 문제를 풀고 왔더니 쉽게 느껴졌다.
그런데 만약 이걸 stack 없이 구현하려고 했다면?
react였다면 useState에 배열을 넣고 이전값과 비교해야했을 것이고
index를 저장하거나 별도의 변수를 생성했을 것이다.
이거 고민하고 디버깅하느라 1시간 걸렸을 듯...