선언 방식
function add(a, b) {
return a + b;
}
const add2 = (a, b) => a + b;
const add3 = (a, b) => {
return a + b;
};
화살표 함수는 this 바인딩이 다릅니다. 알고리즘 문제에서는 보통 this를 쓰지 않으므로 둘 다 괜찮습니다.
기본 인자·나머지
function greet(name = 'guest') {
return `hi ${name}`;
}
function sum(...nums) {
return nums.reduce((a, b) => a + b, 0);
}
순수에 가깝게
같은 입력이면 같은 출력을 내고, 외부 배열을 직접 수정하지 않는 편이 테스트하기 쉽습니다.
// 비추천: 원본 정렬
function bad(arr) {
arr.sort((a, b) => a - b);
return arr;
}
// 추천
function good(arr) {
return [...arr].sort((a, b) => a - b);
}
채점 입력을 돌연변이하면 다음 케이스가 깨질 수 있습니다 (환경에 따라).
조기 반환
function solve(input) {
const s = input.trim();
if (!s) return '0';
// 본 로직
}
예외·빈 입력을 위에서 끊으면 본문이 단순해집니다.
재귀는 다음 단계
함수가 자기 자신을 부르는 것은 알고리즘 원리 · 재귀 레슨에서 다룹니다.
문법만으로도 solve를 헬퍼로 쪼개 쓰는 연습이 충분합니다.
헬퍼로 쪼개기
function parseNums(input) {
return input.trim().split(/\s+/).map(Number);
}
function solve(input) {
const [a, b] = parseNums(input);
return String(a + b);
}
채점 진입점은 solve 하나여도, 안은 작은 함수로 나누면 테스트·읽기가 쉽습니다.
클로저 맛보기
function counter() {
let n = 0;
return () => ++n;
}
알고리즘 문제에서는 드물지만, “함수가 환경을 기억한다”만 알아 두세요.