이번 글에서는 JavaScript에서 배열의 빈 자리를 0으로 동적으로 채우는 알고리즘을 살펴보겠습니다. 이 문제는 월(month) 데이터를 다룰 때 자주 마주치는 상황으로, 실무에서도 유용하게 활용할 수 있습니다.
문제 정의
1부터 12 사이의 숫자(양 끝값 포함)로 이루어진 months 배열이 주어집니다. 이 배열은 12개보다 적은 요소를 가질 수 있습니다. 우리가 해야 할 일은 이 배열을 받아서 항상 12개의 요소를 가진 완전한 월 배열을 만드는 것입니다. 원본 배열에 해당 월이 존재하면 그 값을 그대로 사용하고, 존재하지 않으면 그 자리에 0을 채워 넣습니다.
예를 들어 다음과 같습니다.
입력 → [5, 7, 9]
출력 → [0, 0, 0, 0, 5, 0, 7, 0, 9, 10, 0, 0]
해결 방법
핵심 아이디어는 간단합니다. 1부터 12까지 반복하면서 현재 숫자가 원본 배열에 포함되어 있는지 확인하고, 포함되어 있다면 해당 값을 새 배열에 추가하고, 없다면 0을 추가하는 것입니다.
코드 예제
const months = [6, 7, 10, 12];
const completeMonths = (arr) => {
const completed = [];
for (let i = 1; i <= 12; i++) {
if (arr.includes(i)) {
completed.push(i);
} else {
completed.push(0);
}
}
return completed;
};
console.log(completeMonths(months));
동작 원리
위 코드는 1부터 12까지 차례대로 반복하면서, 매번 Array.prototype.includes() 메서드를 사용해 원본 배열에 현재 숫자가 있는지 검사합니다. 값이 존재하면 그 값을 새 배열에 push하고, 존재하지 않으면 0을 push합니다. 이렇게 하면 입력 배열의 요소 개수와 관계없이 항상 길이가 12인 배열을 얻을 수 있습니다.
실행 결과
위 코드를 실행하면 콘솔에 다음과 같은 결과가 출력됩니다.
[
0, 0, 0, 0, 0,
6, 7, 0, 0, 10,
0, 12
]
추가 팁: 더 간결한 대안
같은 로직을 Array.from()과 삼항 연산자를 사용해 한 줄로 표현할 수도 있습니다.
const completeMonths = (arr) =>
Array.from({ length: 12 }, (_, i) => arr.includes(i + 1) ? i + 1 : 0);
이 방식은 코드가 더 짧아지고 함수형 스타일을 선호하는 프로젝트에서 가독성이 좋습니다. 다만 데이터 크기가 커지면 includes() 호출이 반복되므로 성능이 중요한 경우에는 Set을 활용해 조회 속도를 높이는 것도 고려해 볼 수 있습니다.