읽기 전에 알아두면 좋아요
본문부터 시작해도 좋습니다. 낯선 개념이 나오면 설명과 작은 예제를 함께 읽어 보세요.
개념과 예제는 실행하지 않아도 읽을 수 있습니다. 내 컴퓨터·터미널에서 직접 실행하는 과정은 선택 실습입니다.
과정 위치와 선택 복습 안내
과정 위치: 준비와 기초 구현 · 알고리즘 개념
과정 위치는 이 글이 속한 묶음입니다. 이 단계의 모든 개념을 먼저 읽을 필요는 없습니다. 위에 연결한 개념 중 낯선 내용만 복습하세요. 문제의 조건·상태·갱신 순서는 익숙한 언어로 설명하면 됩니다.
JavaScript로 문법·실행 복습하기 (선택)
개념 글의 코드는 JavaScript 예시입니다. 문제 화면에서는 JavaScript·Python·Java·C++·C# 중 익숙한 언어의 함수를 작성하세요. 본문의 Node.js 입출력 예시는 로컬 실행을 위한 별도 안내입니다.
기초 구현에서 읽을 값·검사 조건·유지할 상태를 어떻게 나누나요?
기초 구현은 읽을 값, 검사할 조건, 유지할 상태를 나누면 단순해집니다. 합·개수·최솟값처럼 답에 필요한 값만 저장하고 현재 값을 읽을 때 갱신합니다.

[4,7,-3,2]의 홀수는 7과 -3입니다. 합은 4, 개수는 2, 최솟값은 -3입니다. 음수까지 허용하면 홀수를 “나머지가 1”로만 검사하면 안 됩니다.
적용 조건·범위: 평균을 정수로 반올림하거나 버리지는 않습니다. [1, 2]의 평균은 1.5입니다. 출력 자릿수나 정수 변환이 필요하면 문제의 규칙에 맞춰 마지막에 처리하세요. Number 소수에는 반올림 오차가 있으므로 모든 소수·큰 정수의 정밀한 평균을 보장하는 함수는 아닙니다. 자료형의 유한값·정수 정밀도는 ECMAScript의 Number 규칙을 기준으로 확인했습니다.
본문 근거: ECMAScript 2025 — Number remainder · ECMAScript의 Number 규칙

이 글에서 할 일: 언어와 관계없이 조건·초기값·갱신 순서를 정하고 예제에서 추적합니다. 선수 지식: 변수·배열의 기본 형태.
조건을 통과한 값만 상태에 반영합니다
아래 JavaScript 예제는 배열에서 홀수만 골라 합·개수·최솟값을 구합니다. 코드 아래의 결과와 표를 보면서 값이 어떻게 바뀌는지 살펴보세요. 직접 실행하지 않아도 설명을 따라갈 수 있습니다.

function summarizeOdds(values) {
let sum = 0;
let count = 0;
let minimum = null;
for (const value of values) {
if (value % 2 !== 0) {
sum += value;
count++;
if (minimum === null || value < minimum) minimum = value;
}
}
return { sum, count, minimum };
}
console.log(JSON.stringify(summarizeOdds([4, 7, -3, 2])));
console.log(JSON.stringify(summarizeOdds([2, 4])));
실행 결과
{"sum":4,"count":2,"minimum":-3}
{"sum":0,"count":0,"minimum":null}
| 현재 값 | 합 | 개수 | 최솟값 |
|---|---|---|---|
| 초기 | 0 | 0 | null |
| 4 | 0 | 0 | null |
| 7 | 7 | 1 | 7 |
| -3 | 4 | 2 | -3 |
| 2 | 4 | 2 | -3 |
불변식은 “상태에 지금까지 읽은 홀수만 반영되어 있다”입니다. 조건을 통과한 같은 블록에서 합·개수·최솟값을 갱신합니다. 최솟값의 초기 0은 양수만 들어올 때 잘못 남을 수 있으므로, 아직 값이 없다는 상태를 따로 둡니다.
이 예제는 홀수가 없으면 sum=0, count=0, minimum=null을 반환합니다. 문제에서 홀수의 존재를 보장하거나 실패 출력을 지정했다면 그 계약을 따릅니다. 반환 형식과 화면에 출력할 형식도 구분하세요.
내 컴퓨터에서 직접 실행하기 — 홀수 예제 (선택)
코드를 직접 바꿔보고 싶은 분을 위한 안내입니다. 이 과정은 방문자 자신의 컴퓨터에서 진행하며, 글을 읽기 위해 반드시 실행할 필요는 없습니다.
준비물: Node.js와 코드 편집기인 Visual Studio Code(VS Code). Node.js는 JavaScript 파일을 컴퓨터에서 실행하는 프로그램입니다. 아직 설치하지 않았다면 두 프로그램의 공식 사이트에서 설치한 뒤 진행하세요.
- 컴퓨터에 연습용 폴더를 하나 만들고, VS Code에서 파일 → 폴더 열기로 그 폴더를 엽니다.
- 그 폴더 안에
odd-summary.js파일을 만듭니다. 위의 JavaScript 예제 전체를 복사해 붙여넣고 저장하세요. 마지막console.log줄도 포함하며, 파일 이름 끝이.js.txt가 되지 않도록 확인합니다. - VS Code의 터미널 → 새 터미널을 선택합니다. 아래쪽에 열린 터미널은 명령어를 입력하는 창입니다. 다음 명령으로 Node.js 설치 여부를 확인합니다.
node --version
v로 시작하는 버전 번호가 나오면 실행할 수 있습니다. 명령을 찾을 수 없다는 메시지가 나오면 Node.js를 설치하고 VS Code를 완전히 닫았다가 다시 여세요.
터미널의 현재 위치가 방금 파일을 저장한 폴더인지 확인한 뒤, 다음 명령을 입력하고 Enter를 누릅니다. 이 명령은 JavaScript 파일 안이 아니라 터미널에 입력합니다.
node odd-summary.js
터미널에 나온 값을 위의 실행 결과와 비교하세요. Cannot find module이 나오면 파일 이름과 저장 여부, 터미널에서 연 폴더가 같은지 확인합니다.
정수 계산은 나눗셈과 나머지의 의미를 확인합니다
양의 정수 N개를 한 묶음에 K개씩 담으면 필요한 묶음 수는 몫 + (나머지가 있으면 1)입니다. N=13, K=12이면 몫 1과 나머지 1이므로 두 묶음, N=24이면 두 묶음입니다. (N+K-1)/K를 정수 나눗셈으로 계산하는 방식은 덧셈의 오버플로도 고려해야 합니다.

언어마다 /가 정수 나눗셈인지 실수 나눗셈인지, 음수 나눗셈을 어느 방향으로 버리는지가 다릅니다. JavaScript Number의 나눗셈은 실수 결과이며, 양수 몫에는 Math.floor(N / K)를 쓸 수 있습니다. 음수를 포함한 홀수는 value % 2 !== 0으로 판별합니다.
| 목표 | 경계 |
|---|---|
| 삼각형 | 가장 긴 변 < 나머지 두 변의 합; 같은 경우는 불가 |
| 끝자리 | 음수가 없는 정수에서 value % 10 |
| 가위바위보 | 무승부를 먼저 분리하고 승리 조합을 명시 |
| 최솟값·최댓값 | 실제 첫 값 또는 값 없음 상태에서 시작 |
직전 값과 누적 상태를 구분합니다
아래 JavaScript 예제는 정답이 이어질 때 점수를 누적합니다. 현재 연속 정답 수와 전체 점수가 각각 어떻게 바뀌는지 코드와 설명을 함께 읽어보세요.

function consecutiveScore(answers) {
let streak = 0;
let total = 0;
for (const answer of answers) {
if (answer === 1) streak++;
else streak = 0;
total += streak;
}
return total;
}
console.log(consecutiveScore([1, 1, 0, 1, 1, 1]));
실행 결과
9
streak는 현재 위치에서 끝나는 연속 정답 수, total은 지금까지 얻은 전체 점수입니다. 오답이면 streak만 0으로 초기화합니다. 예제의 streak는 1,2,0,1,2,3이고 이를 더하면 9입니다. total까지 초기화하면 앞에서 얻은 점수를 잃습니다.
큰 수 출력 문제는 직전 원소와 비교하지만, 보이는 학생 문제는 지금까지의 최댓값과 비교합니다. [170,160,165]의 마지막 학생은 직전 학생보다 크지만 맨 앞 170보다 작아 보이지 않습니다. 유지할 상태를 “이전 값”인지 “이전 전체의 최댓값”인지 말로 먼저 정의하세요.
두 독립 함수는 N개를 한 번 읽으므로 O(N) 시간, 추가 상태가 고정 개수라 O(1) 공간을 사용합니다. 입력 배열의 저장 비용은 별도입니다. 다른 언어로 옮길 때도 상태의 뜻과 갱신 순서는 유지하고 정수 범위·나눗셈·빈값 표현만 맞춥니다.
내 컴퓨터에서 직접 실행하기 — 연속 정답 예제 (선택)
코드를 직접 바꿔보고 싶은 분을 위한 안내입니다. 이 과정은 방문자 자신의 컴퓨터에서 진행하며, 글을 읽기 위해 반드시 실행할 필요는 없습니다.
준비물: Node.js와 코드 편집기인 Visual Studio Code(VS Code). Node.js는 JavaScript 파일을 컴퓨터에서 실행하는 프로그램입니다. 아직 설치하지 않았다면 두 프로그램의 공식 사이트에서 설치한 뒤 진행하세요.
- 컴퓨터에 연습용 폴더를 하나 만들고, VS Code에서 파일 → 폴더 열기로 그 폴더를 엽니다.
- 그 폴더 안에
consecutive.js파일을 만듭니다. 위의 JavaScript 예제 전체를 복사해 붙여넣고 저장하세요. 마지막console.log줄도 포함하며, 파일 이름 끝이.js.txt가 되지 않도록 확인합니다. - VS Code의 터미널 → 새 터미널을 선택합니다. 아래쪽에 열린 터미널은 명령어를 입력하는 창입니다. 다음 명령으로 Node.js 설치 여부를 확인합니다.
node --version
v로 시작하는 버전 번호가 나오면 실행할 수 있습니다. 명령을 찾을 수 없다는 메시지가 나오면 Node.js를 설치하고 VS Code를 완전히 닫았다가 다시 여세요.
터미널의 현재 위치가 방금 파일을 저장한 폴더인지 확인한 뒤, 다음 명령을 입력하고 Enter를 누릅니다. 이 명령은 JavaScript 파일 안이 아니라 터미널에 입력합니다.
node consecutive.js
터미널에 나온 값을 위의 실행 결과와 비교하세요. Cannot find module이 나오면 파일 이름과 저장 여부, 터미널에서 연 폴더가 같은지 확인합니다.
직접 확인하고 문제에 적용하기
연속 정답 [1,1,0,1]에서 total을 오답마다 초기화하면 어떤 결과가 나올까요? 올바른 값과 비교해 보세요.

답과 이유 확인
잘못된 구현은 마지막 1만 남겨 1을 반환할 수 있습니다. 올바른 점수는 1+2+0+1=4입니다. 빈 입력은 합과 개수 0, 최솟값 null이며 연속 점수도 0입니다.
참고 자료
자료 확인일: 2026년 10월 19일.
- ECMAScript 2025 — Number remainder — JavaScript 나머지 연산과 음수의 부호.
평균: 합과 개수를 모은 뒤 마지막에 나눕니다
네 점수 87, 70, 100, 55의 평균은 (87 + 70 + 100 + 55) / 4 = 78입니다. 먼저 합을 구하고 실제로 포함한 값의 개수로 나눕니다. 덧셈을 괄호로 묶지 않은 87 + 70 + 100 + 55 / 4는 마지막 점수만 나누므로 다른 계산입니다.

첨부 dev/average.mjs는 네 변수를 직접 더하고 4로 나눕니다. dev/average2.mjs는 같은 점수를 배열에 넣고 반복문으로 합을 만든 뒤 arr.length로 나눕니다. 값의 개수가 바뀌어도 반복문은 그대로 쓸 수 있다는 점이 두 파일의 차이입니다. 기존 홀수 예제에서 배운 합·개수 상태를 전체 원소에 적용하면 같은 구조가 됩니다.
반복 중에는 평균이 아니라 합을 유지합니다
| 읽은 값 | sum | count |
|---|---|---|
| 초기 | 0 | 0 |
| 87 | 87 | 1 |
| 70 | 157 | 2 |
| 100 | 257 | 3 |
| 55 | 312 | 4 |
반복이 끝날 때 sum은 모든 점수의 합 312이고 count는 4입니다. 마지막에 한 번 312 / 4를 계산합니다. 원본의 변수 이름은 average이지만 반복문 안에서는 아직 합을 담고 있고, 나눗셈 뒤에야 평균이 됩니다. 상태가 맡은 뜻을 분명히 하려고 아래 예제에서는 sum과 average를 나눕니다. 이 순회는 n개 값에 O(n) 시간, 고정된 합·개수에 O(1) 추가 공간을 씁니다.
빈 입력과 반환 모양을 먼저 정합니다
원본 두 파일은 변수에 계산 결과를 저장할 뿐, 함수의 반환이나 console.log가 없습니다. 그대로 실행해도 78이 화면에 출력되지는 않습니다. 아래 독립 예제는 결과를 확인할 수 있도록 summarizeAverage(values) 함수를 만들고, 숫자 하나 대신 { sum, count, average } 객체를 반환합니다. 평균만 필요하면 반환 객체의 average를 읽습니다. 이것은 원본과 구분한 학습용 반환 계약입니다.
배열이 비어 있을 때 원본의 계산은 0 / 0이 되어 NaN입니다. 아래 함수는 평균이 없다는 뜻으로 { sum: 0, count: 0, average: null }을 반환합니다. 점수가 모두 0인 경우의 평균 0과 구분할 수 있습니다. 빈 칸이 없는 유한 숫자 배열만 받으며, 문자열 숫자·NaN·Infinity·희소 배열은 오류로 알립니다. 원소가 유한해도 중간 합이 Infinity가 되면 거절합니다.
평균을 정수로 반올림하거나 버리지는 않습니다. [1, 2]의 평균은 1.5입니다. 출력 자릿수나 정수 변환이 필요하면 문제의 규칙에 맞춰 마지막에 처리하세요. Number 소수에는 반올림 오차가 있으므로 모든 소수·큰 정수의 정밀한 평균을 보장하는 함수는 아닙니다. 자료형의 유한값·정수 정밀도는 ECMAScript의 Number 규칙을 기준으로 확인했습니다.
추가 예제 코드와 실행 방법 펼치기
직접 실행할 때만 펼쳐 보세요. Node.js 시작 안내를 확인하고 supplement-average-state.js로 저장합니다.
function summarizeAverage(values) {
if (!Array.isArray(values)) throw new TypeError('숫자 배열을 넣어 주세요.');
let sum = 0;
let count = 0;
for (let i = 0; i < values.length; i++) {
if (!Object.hasOwn(values, i) || !Number.isFinite(values[i])) {
throw new TypeError('빈 칸 없는 유한 숫자 배열이 필요합니다.');
}
sum += values[i];
if (!Number.isFinite(sum)) throw new RangeError('중간 합이 유한 숫자 범위를 벗어났습니다.');
count++;
}
return { sum, count, average: count === 0 ? null : sum / count };
}
console.log((87 + 70 + 100 + 55) / 4);
console.log(JSON.stringify(summarizeAverage([87, 70, 100, 55])));
console.log(JSON.stringify(summarizeAverage([])));
console.log(JSON.stringify(summarizeAverage([1, 2])));
파일이 있는 폴더의 터미널에서 실행합니다.
node supplement-average-state.js
기대 출력
78
{"sum":312,"count":4,"average":78}
{"sum":0,"count":0,"average":null}
{"sum":3,"count":2,"average":1.5}
이 글이 도움이 되었나요?
이어서 공부하기
체크포인트: 예제의 상태 변화를 손으로 추적하고 아래 문제에 적용하세요. 값이 없는 경우와 원소 하나인 경우도 설명해 보세요. 직전 값과 지금까지의 최댓값을 구분하고, 초기값과 갱신 순서를 손으로 추적하세요.
이 개념으로 더 풀어보기
다음 추천 · 자료구조 개념: JavaScript 배열: 인덱스 조회와 삽입·삭제 비용
권장 순서는 학습 가이드와 같습니다. 다른 순서는 접힌 참고 목록에서 확인할 수 있습니다. 읽음 표시는 숙달이나 채점 결과가 아닙니다.
원래 과정 목록 순서 (선택)
읽음 기록
읽음 — / 전체 30개 · 필수 0개
새 글 받아보기
RSS 리더에서 BlogFlow의 새 글을 확인할 수 있습니다.