읽기 전에 알아두면 좋아요
아래 개념이 익숙하면 본문을 바로 읽으세요. 낯선 개념만 링크에서 복습하면 됩니다.
- 기초 구현 패턴: 조건·정수 계산·순회·상태 갱신변수에 값을 담고 조건에 따라 합·개수·최솟값을 갱신하는 기초부터 확인합니다. 홀수 조건을 통과한 값에만 합·최솟값을 갱신합니다.
- JavaScript 배열: 인덱스 조회와 삽입·삭제 비용배열은 여러 값을 순서대로 담습니다. 인덱스로 값을 읽고 반복문으로 하나씩 살펴봅니다. 인덱스 접근과 배열을 순회할 때의 연산 비용을 확인합니다.
개념과 예제는 실행하지 않아도 읽을 수 있습니다. 내 컴퓨터·터미널에서 직접 실행하는 과정은 선택 실습입니다.
과정 위치와 선택 복습 안내
과정 위치: 준비와 기초 구현 · 문제
과정 위치는 이 글이 속한 묶음입니다. 이 단계의 모든 개념을 먼저 읽을 필요는 없습니다. 위에 연결한 개념 중 낯선 내용만 복습하세요. 문제의 조건·상태·갱신 순서는 익숙한 언어로 설명하면 됩니다.
JavaScript로 문법·실행 복습하기 (선택)
개념 글의 코드는 JavaScript 예시입니다. 문제 화면에서는 JavaScript·Python·Java·C++·C# 중 익숙한 언어의 함수를 작성하세요. 본문의 Node.js 입출력 예시는 로컬 실행을 위한 별도 안내입니다.
홀수 문제는 자연수 7개에서 어떤 두 값을 어떤 형태로 반환하나요?
자연수 7개에서 홀수의 합과 가장 작은 홀수를 구하는 문제입니다. 입력 조건과 예제를 확인한 뒤, 두 결과를 [합, 최솟값]으로 반환하는 함수를 직접 작성해 보세요.
적용 조건·범위: 홀수가 반드시 하나 이상이라는 조건을 유지하세요. 2 4 6 8 10 12 9이면 합과 최솟값이 모두 9이고, 본문 혼합 예제는 256과 41입니다. 홀수가 없는 입력은 이 풀이의 입력 계약 밖입니다.
공식 문서 참고: 관련 개념: MDN 나머지 연산으로 자연수 홀짝 판별 · 관련 개념: MDN Math.min으로 홀수 최솟값 유지
무엇을 구하나요?
자연수 7개에서 홀수의 합과 가장 작은 홀수를 구합니다. 모든 수는 100보다 작고, 홀수가 반드시 하나 이상 있습니다.
입력 예시12 77 38 41 53 92 85
홀수는 77, 41, 53, 85입니다. 이 수들을 더하면 256, 가장 작은 수는 41입니다.
출력 — 첫 줄에 홀수의 합, 둘째 줄에 가장 작은 홀수를 씁니다.
256
41
직접 풀어보기
먼저 선택한 언어의 입력·반환 계약에 맞춰 작성해 보세요. 힌트 받기와 정답과 비교하기는 코드를 실행하지 않는 AI 분석입니다. 해답·해설은 아래에서 필요할 때 펼칠 수 있습니다.
AI 힌트
코드를 실행한 채점 결과가 아닌 AI의 코드 분석입니다.
해답·해설 보기
function solution(numbers) {
let sum = 0, minimum = 100;
for (const value of numbers) if (value % 2 === 1) {
sum += value;
minimum = Math.min(minimum, value);
}
return [sum, minimum];
}
solution(numbers)에 자연수 7개 배열을 전달하며 [합,최솟값] 숫자 배열을 반환합니다. 입력은 문제의 유효한 범위를 만족합니다. 표준 입력·출력 없이 결과를 반환하세요.
def solution(numbers):
total, minimum = 0, 100
for value in numbers:
if value % 2 == 1:
total += value
minimum = min(minimum,value)
return [total,minimum]
solution(numbers)에 자연수 7개 리스트를 전달하며 [합,최솟값] 정수 리스트를 반환합니다. 입력은 문제의 유효한 범위를 만족합니다. 표준 입력·출력 없이 결과를 반환하세요.
import java.util.*;
class Solution {
public int[] solution(int[] numbers) {
int sum = 0, minimum = 100;
for (int value : numbers) if (value % 2 == 1) {
sum += value;
minimum = Math.min(minimum, value);
}
return new int[] {
sum, minimum
};
}
}
Solution.solution(int[] numbers)는 {합,최솟값} int[]를 반환합니다. 입력은 문제의 유효한 범위를 만족합니다. 표준 입력·출력 없이 결과를 반환하세요.
#include <algorithm>
#include <vector>
using namespace std;
vector < int > solution(const vector < int > & numbers) {
int sum = 0, minimum = 100;
for (int value : numbers) if (value % 2 == 1) {
sum += value;
minimum = min(minimum, value);
}
return {
sum, minimum
};
}
solution(const vector<int>& numbers)는 {합,최솟값} vector<int>를 반환합니다. 입력은 문제의 유효한 범위를 만족합니다. 표준 입력·출력 없이 결과를 반환하세요.
using System;
using System.Collections.Generic;
using System.Text;
public class Solution {
public int[] Solve(int[] numbers) {
int sum = 0, minimum = 100;
foreach(int value in numbers) if (value % 2 == 1) {
sum += value;
minimum = Math.Min(minimum, value);
}
return new int[] {
sum, minimum
};
}
}
Solution.Solve(int[] numbers)는 new int[]{합,최솟값}을 반환합니다. 입력은 문제의 유효한 범위를 만족합니다. 표준 입력·출력 없이 결과를 반환하세요.
숫자를 하나씩 확인하면 됩니다
- 합
sum은 0, 최솟값minimum은 100에서 시작합니다. - 2로 나눈 나머지가 1이면 홀수입니다. 합에 더하고, 지금까지의 최솟값과 비교해 작은 수를 남깁니다.
- 7개를 모두 확인한 뒤 합과 최솟값을 돌려줍니다. 예제의 함수 반환값은
[256, 41]입니다.
입력이 모두 100보다 작으므로 최솟값을 100에서 시작할 수 있습니다. 홀수가 하나 이상 있어 마지막에는 실제 홀수로 바뀝니다.
직접 풀고 피드백 받기를 열고 언어를 고른 뒤 코드를 작성하면 AI 힌트나 정답과의 비교를 받을 수 있습니다. 코드를 실행해 채점하는 기능은 아닙니다.
예제 추적·입출력 코드·경계 사례

예제로 따라가는 합과 최솟값
입력 12 77 38 41 53 92 85를 왼쪽부터 읽습니다. 표의 합과 최솟값은 해당 숫자를 처리한 직후의 상태입니다.
| 현재 값 | 판별 | 합 | 최솟값 |
|---|---|---|---|
| 초기 | 아직 안 읽음 | 0 | 100 |
| 12 | 짝수 | 0 | 100 |
| 77 | 홀수 | 77 | 77 |
| 38 | 짝수 | 77 | 77 |
| 41 | 홀수 | 118 | 41 |
| 53 | 홀수 | 171 | 41 |
| 92 | 짝수 | 171 | 41 |
| 85 | 홀수 | 256 | 41 |
77을 읽으면 합과 최솟값이 모두 77이 됩니다. 41을 읽을 때는 합이 118로 늘고 최솟값이 41로 바뀝니다. 이후 53과 85는 합에만 더해지고, 최솟값은 41을 유지합니다. 최종 결과는 [256, 41]입니다.
코드에서 확인할 세 줄
if (value % 2 === 1) {
sum += value;
minimum = Math.min(minimum, value);
}
value % 2 === 1: 자연수를 2로 나눈 나머지가 1이면 홀수입니다.sum += value: 홀수의 합에 현재 값만 더합니다.Math.min(minimum, value): 지금까지의 최솟값과 현재 홀수 중 작은 값을 남깁니다.
최솟값 비교를 if 밖에 두면 짝수가 최솟값에 섞일 수 있습니다. 두 갱신을 같은 조건문 안에 모으는 것이 핵심입니다. 처음 값을 0으로 잡으면 양수인 입력보다 항상 작으므로 최솟값이 잘못 남습니다.
함수 결과를 문제의 출력 형식으로 바꾸기

언어별 정답은 숫자 목록을 받아 합과 최솟값을 돌려주는 함수입니다. JavaScript의 solution(numbers)는 [합, 최솟값] 배열을 반환합니다. 피드백 입력창에는 이 함수만 작성합니다. 터미널에서 첫 줄에 합, 둘째 줄에 최솟값을 출력하려면 다음 입력·출력 코드를 덧붙입니다.
const fs = require('fs');
const numbers = fs.readFileSync(0, 'utf8').trim().split(/\s+/).map(Number);
const [sum, minimum] = solution(numbers);
console.log(sum);
console.log(minimum);
해답 탭의 JavaScript 함수와 위 입력·출력 코드를 순서대로 solution.cjs에 저장합니다. input.txt에는 12 77 38 41 53 92 85를 적고 실행합니다.
node solution.cjs < input.txt
PowerShell에서는 cmd /c "node solution.cjs < input.txt"로 실행합니다. 결과는 다음과 같아야 합니다.
256
41
복잡도와 검증
입력 개수를 N으로 두면 한 번의 순회에 O(N) 시간이 걸립니다. 이미 주어진 배열을 읽는 실습 함수의 추가 상태는 합과 최솟값뿐이므로 O(1) 추가 공간을 씁니다. 위 Node.js 입력 코드는 숫자 배열을 별도로 만들기 때문에 입력 저장까지 포함하면 O(N) 공간입니다. 이 문제의 N은 7로 고정되어 있습니다.
| 확인할 경우 | 입력 | 기대 결과 |
|---|---|---|
| 홀수 하나 | 2 4 6 8 10 12 9 |
[9, 9] |
| 모두 홀수 | 7 9 11 13 15 17 19 |
[91, 7] |
| 같은 홀수 반복 | 99 99 99 99 99 99 99 |
[693, 99] |
홀수가 하나뿐이면 합과 최솟값은 같습니다. 중복된 홀수는 각각 합에 더해야 합니다. 홀수가 없는 입력은 원문의 입력 조건 밖이므로 임의의 실패 출력 규칙을 추가하지 않습니다.
문제 원문과 출처 확인
문제
7개의 자연수가 주어질 때, 이들 중 홀수인 자연수들을 모두 골라 그 합을 구하고, 고른 홀수들 중 최솟값을 찾는 프로그램을 작성하세요. 예를 들어 12, 77, 38, 41, 53, 92, 85가 주어지면 홀수의 합은 256이고, 홀수 중 최솟값은 41입니다.
입력설명
첫 번째 줄에 자연수 7개가 주어집니다. 주어지는 자연수는 100보다 작습니다. 홀수가 한 개 이상 반드시 존재합니다.
출력설명
첫째 줄에 홀수들의 합을 출력하고, 둘째 줄에 홀수들 중 최솟값을 출력합니다.
입력예제 1
12 77 38 41 53 92 85
출력예제 1
256
41
제공 학습 자료의 출처 표기: 한국정보올림피아드
추가 제한 사항
원자료와 확인 범위
2026-10-12에 제공된 학습 자료 섹션 1. 기본문제풀이.pdf의 6쪽 ‘홀수’와 문제 조건·예제를 대조했습니다. 같은 ZIP의 해당 문제 TXT는 풀이 코드 자료입니다. 이 자료의 최초 출제 원문·저자·공개 배포 주소까지 확인한 것은 아닙니다.
제공 PDF에는 한국정보올림피아드가 출처로 표시되어 있습니다. 이번 확인에서 KOI 공식 과거 대회 기록의 해당 옛 문제 원본을 확보하지 못했으므로 대회 연도·부문과 공식 채점 결과를 추가로 단정하지 않습니다.
이번 대조는 원자료의 문제 조건과 예제 확인입니다. 이 글의 전체 코드를 새로 실행하거나 공식 채점에 제출한 결과를 뜻하지 않습니다. 아래 예제·자가 확인 항목은 직접 실행해 기대 출력과 비교하는 기준입니다.
이 문제를 푼 뒤 확인하기
홀수가 반드시 하나 이상이라는 조건을 유지하세요. 2 4 6 8 10 12 9이면 합과 최솟값이 모두 9이고, 본문 혼합 예제는 256과 41입니다. 홀수가 없는 입력은 이 풀이의 입력 계약 밖입니다.
본문의 예제와 이 반례를 직접 실행해 예상 출력과 비교하고, 결과가 다르면 입력 조건과 반복 범위를 다시 확인하세요.
이 글이 도움이 되었나요?
이어서 공부하기
체크포인트: 해설을 가리고 다시 풀고, 경계 입력을 하나 바꾸어 예상 결과와 실제 결과를 비교하세요. 직전 값과 지금까지의 최댓값을 구분하고, 초기값과 갱신 순서를 손으로 추적하세요.
다음 추천 · 문제: 10부제 풀이: 끝자리 비교로 위반 차량 수 세기
권장 순서는 학습 가이드와 같습니다. 다른 순서는 접힌 참고 목록에서 확인할 수 있습니다. 읽음 표시는 숙달이나 채점 결과가 아닙니다.
원래 과정 목록 순서 (선택)
읽음 기록
읽음 — / 전체 58개 · 필수 58개
새 글 받아보기
RSS 리더에서 BlogFlow의 새 글을 확인할 수 있습니다.