읽기 전에 알아두면 좋아요
아래 개념이 익숙하면 본문을 바로 읽으세요. 낯선 개념만 링크에서 복습하면 됩니다.
- 기초 구현 패턴: 조건·정수 계산·순회·상태 갱신변수에 값을 담고 조건에 따라 합·개수·최솟값을 갱신하는 기초부터 확인합니다. 연속 정답 상태와 전체 합계를 나누고 오답에서 상태를 초기화합니다.
- JavaScript 배열: 인덱스 조회와 삽입·삭제 비용배열은 여러 값을 순서대로 담습니다. 인덱스로 값을 읽고 반복문으로 하나씩 살펴봅니다. 인덱스 접근과 배열을 순회할 때의 연산 비용을 확인합니다.
개념과 예제는 실행하지 않아도 읽을 수 있습니다. 내 컴퓨터·터미널에서 직접 실행하는 과정은 선택 실습입니다.
과정 위치와 선택 복습 안내
과정 위치: 준비와 기초 구현 · 문제
과정 위치는 이 글이 속한 묶음입니다. 이 단계의 모든 개념을 먼저 읽을 필요는 없습니다. 위에 연결한 개념 중 낯선 내용만 복습하세요. 문제의 조건·상태·갱신 순서는 익숙한 언어로 설명하면 됩니다.
JavaScript로 문법·실행 복습하기 (선택)
개념 글의 코드는 JavaScript 예시입니다. 문제 화면에서는 JavaScript·Python·Java·C++·C# 중 익숙한 언어의 함수를 작성하세요. 본문의 Node.js 입출력 예시는 로컬 실행을 위한 별도 안내입니다.
점수계산 문제에서는 정답과 오답이 담긴 배열로 무엇을 구하나요?
정답과 오답이 주어진 배열에서 연속 정답의 점수 규칙에 따라 총점을 구하는 문제입니다. 배열·조건문·누적값의 기본을 준비하고, 아래 입력·반환 계약을 확인해 직접 풀어보세요.
적용 조건·범위: 이번 대조는 원자료의 문제 조건과 예제 확인입니다. 이 글의 전체 코드를 새로 실행하거나 공식 채점에 제출한 결과를 뜻하지 않습니다. 아래 예제·자가 확인 항목은 직접 실행해 기대 출력과 비교하는 기준입니다.
공식 문서 참고: 관련 개념: MDN 조건별 상태 갱신과 if·else
문제
N개의 채점 결과가 순서대로 주어집니다. 정답은 1, 오답은 0입니다. 정답을 처음 맞히면 1점을 받고, 정답이 연속될 때마다 해당 문제의 점수가 1점씩 증가합니다. 오답이 나오면 연속 점수는 0으로 초기화됩니다. 모든 문제를 채점한 총점을 출력해야 합니다.
N은 1 이상 100 이하의 자연수이며, 둘째 줄에는 N개의 0 또는 1이 주어집니다. 예제 입력이 1 0 1 1 1 0 0 1 1 0이면 각 문제의 점수는 1, 0, 1, 2, 3, 0, 0, 1, 2, 0이므로 총점은 10점입니다.
| 구간 | 채점 결과 | 획득 점수 |
|---|---|---|
| 첫 번째 정답 | 1 | 1 |
| 세 문제 연속 정답 | 1 1 1 | 1 + 2 + 3 |
| 오답 | 0 | 0, 연속 점수 초기화 |
| 두 문제 연속 정답 | 1 1 | 1 + 2 |
직접 풀어보기
먼저 선택한 언어의 입력·반환 계약에 맞춰 작성해 보세요. 힌트 받기와 정답과 비교하기는 코드를 실행하지 않는 AI 분석입니다. 해답·해설은 아래에서 필요할 때 펼칠 수 있습니다.
AI 힌트
코드를 실행한 채점 결과가 아닌 AI의 코드 분석입니다.
해답·해설 보기
function solve(input) {
const t = input.trim().split(/\s+/).map(Number);
const n = t[0], a = t.slice(1, n + 1);
let streak = 0, total = 0;
for (const x of a) {
streak = x === 1 ? streak + 1 : 0;
total += streak;
}
return String(total);
}
입력 예시 전체를 문자열로 전달하고 출력 문자열을 반환합니다. solve(input)를 호출합니다. 표준 입력·출력 코드는 추가하지 않습니다. 입력 공백과 LF/CRLF 줄바꿈을 처리합니다.
def solve(input):
t = list(map(int, input.split()))
n, a = t[0], t[1:1+t[0]]
streak = total = 0
for x in a:
streak = streak + 1 if x == 1 else 0
total += streak
return str(total)
입력 예시 전체를 문자열로 전달하고 출력 문자열을 반환합니다. solve(input)를 호출합니다. 표준 입력·출력 코드는 추가하지 않습니다. 입력 공백과 LF/CRLF 줄바꿈을 처리합니다.
import java.util.*;
class Solution {
public String solve(String input) {
Scanner sc = new Scanner(input);
int n = sc.nextInt();
int[] a = new int[n];
for (int i = 0; i < n; i++) a[i] = sc.nextInt();
int streak = 0, total = 0;
for (int x : a) {
streak = x == 1 ? streak + 1 : 0;
total += streak;
}
return String.valueOf(total);
}
}
입력 예시 전체를 문자열로 전달하고 출력 문자열을 반환합니다. new Solution().solve(input)를 호출합니다. 표준 입력·출력 코드는 추가하지 않습니다. 입력 공백과 LF/CRLF 줄바꿈을 처리합니다.
#include <algorithm>
#include <sstream>
#include <string>
#include <vector>
std::string solve(const std::string & input) {
std::istringstream in(input);
int n;
in >> n;
std::vector < int > a(n);
for (int & x : a) in >> x;
int streak = 0, total = 0;
for (int x : a) {
streak = x == 1 ? streak + 1 : 0;
total += streak;
}
return std::to_string(total);
}
입력 예시 전체를 문자열로 전달하고 출력 문자열을 반환합니다. solve(input)를 호출합니다. 표준 입력·출력 코드는 추가하지 않습니다. 입력 공백과 LF/CRLF 줄바꿈을 처리합니다.
using System;
using System.Collections.Generic;
public class Solution {
public string Solve(string input) {
string[] t = input.Split((char[]) null, StringSplitOptions.RemoveEmptyEntries);
int n = int.Parse(t[0]);
int[] a = new int[n];
for (int i = 0; i < n; i++) a[i] = int.Parse(t[i + 1]);
int streak = 0, total = 0;
foreach(int x in a) {
streak = x == 1 ? streak + 1 : 0;
total += streak;
}
return total.ToString();
}
}
입력 예시 전체를 문자열로 전달하고 출력 문자열을 반환합니다. new Solution().Solve(input)를 호출합니다. 표준 입력·출력 코드는 추가하지 않습니다. 입력 공백과 LF/CRLF 줄바꿈을 처리합니다.
원자료와 확인 범위
2026-10-12에 제공된 학습 자료 섹션 2. 1, 2차원 탐색.pdf의 4쪽 ‘점수계산’와 문제 조건·예제를 대조했습니다. 같은 ZIP의 해당 문제 TXT는 풀이 코드 자료입니다. 이 자료의 최초 출제 원문·저자·공개 배포 주소까지 확인한 것은 아닙니다.
제공 PDF에는 한국정보올림피아드가 출처로 표시되어 있습니다. 이번 확인에서 KOI 공식 과거 대회 기록의 해당 옛 문제 원본을 확보하지 못했으므로 대회 연도·부문과 공식 채점 결과를 추가로 단정하지 않습니다.
이번 대조는 원자료의 문제 조건과 예제 확인입니다. 이 글의 전체 코드를 새로 실행하거나 공식 채점에 제출한 결과를 뜻하지 않습니다. 아래 예제·자가 확인 항목은 직접 실행해 기대 출력과 비교하는 기준입니다.
풀이와 정답 보기 (클릭)
매 문제에서 필요한 상태는 현재 연속 정답 수와 지금까지의 총점뿐입니다. 정답이면 연속 정답 수를 1 증가시킨 뒤 그 값을 총점에 더합니다. 오답이면 총점은 그대로 두고 연속 정답 수만 0으로 되돌립니다.
알고리즘 설계

streak는 현재 정답이 몇 번 연속됐는지 나타냅니다. 정답을 만나면 먼저 streak를 증가시키고, 증가한 값을 totalScore에 더합니다. 이 순서를 지켜야 첫 정답은 1점, 두 번째 연속 정답은 2점으로 계산됩니다.
오답에서는 streak만 0으로 초기화합니다. 이미 얻은 점수까지 지우면 안 되므로 totalScore는 변경하지 않습니다. 다음 정답이 나오면 다시 1점부터 시작합니다.
변수 두 개를 반복문에서 갱신하는 흐름을 읽을 수 있으면 시작할 수 있습니다. 아래 코드는 Node.js용 전체 파일이므로 solution.cjs에 저장합니다. input.txt의 첫 줄은 예제 결과의 개수 10, 다음 줄은 본문의 1 0 1 1 1 0 0 1 1 0입니다. 파일이 있는 폴더에서 PowerShell 7은 Get-Content -Raw -Encoding UTF8 ./input.txt | node ./solution.cjs, Bash·명령 프롬프트는 node solution.cjs < input.txt로 실행합니다. 총점 10과 비교하되 새 실행을 확인한 기록으로 보지 않습니다.

const fs = require("fs");
const inputText = fs.readFileSync(0, "utf8");
const input = inputText
.trim()
.replaceAll(String.fromCharCode(13), " ")
.replaceAll(String.fromCharCode(10), " ")
.split(" ")
.filter(Boolean)
.map(Number);
const count = input[0];
const results = input.slice(1, count + 1);
let streak = 0;
let totalScore = 0;
for (const result of results) {
if (result === 1) {
streak += 1;
totalScore += streak;
} else {
streak = 0;
}
}
console.log(totalScore);
입력의 CR과 LF를 공백으로 바꾸고 빈 값을 제거하므로 Windows의 CRLF와 Linux의 LF 줄바꿈을 모두 처리합니다. 첫 값은 문제 수이고, 그다음 N개만 채점 결과로 사용합니다.
복잡도와 검증
N개의 결과를 한 번씩 확인하므로 시간 복잡도는 O(N)입니다. 입력 배열을 제외하면 연속 점수와 총점 변수만 사용하므로 추가 공간 복잡도는 O(1)입니다.
| 검증 항목 | 입력 특징 | 기대 출력 |
|---|---|---|
| 제공 예제 | 연속 정답과 오답이 섞임 | 10 |
| 최소 입력 | N=1, 오답 한 개 | 0 |
| 정답 한 개 | N=1, 정답 한 개 | 1 |
| 모두 정답 | 정답 네 개가 연속됨 | 10 |
| 모두 오답 | 오답만 이어짐 | 0 |
배열을 한 번 순회하면서 상태를 갱신하는 흐름은 보이는 학생 JavaScript 풀이에서 먼저 익힐 수 있습니다. 같은 위치의 값을 조건으로 판정하는 다음 유형은 가위바위보 JavaScript 풀이도 참고할 수 있습니다.
이 문제를 푼 뒤 확인하기
연속 정답 뒤 오답이 나오면 연속 점수 streak만 0이 되고 누적 총점은 유지되는지 확인하세요. 1 1 0 1의 총점은 4, 전부 오답이면 0입니다.
본문의 예제와 이 반례를 직접 실행해 예상 출력과 비교하고, 결과가 다르면 입력 조건과 반복 범위를 다시 확인하세요.
글 소개·학습 준비·전체 목차
정답이 연속될수록 다음 정답의 점수가 1점씩 커지는 채점 방식을 계산하는 문제입니다. 현재 연속 정답 수와 전체 점수를 따로 관리하면 배열을 한 번만 순회해 답을 구할 수 있습니다.
이 글이 도움이 되었나요?
이어서 공부하기
체크포인트: 해설을 가리고 다시 풀고, 경계 입력을 하나 바꾸어 예상 결과와 실제 결과를 비교하세요. 직전 값과 지금까지의 최댓값을 구분하고, 초기값과 갱신 순서를 손으로 추적하세요.
다음 추천 · 알고리즘 개념: 문자열 알고리즘 기초: 순회·문자 판별·대소문자 변환·숫자 추출
권장 순서는 학습 가이드와 같습니다. 다른 순서는 접힌 참고 목록에서 확인할 수 있습니다. 읽음 표시는 숙달이나 채점 결과가 아닙니다.
원래 과정 목록 순서 (선택)
읽음 기록
읽음 — / 전체 58개 · 필수 58개
새 글 받아보기
RSS 리더에서 BlogFlow의 새 글을 확인할 수 있습니다.