홀수 풀이: 조건 판별과 결과 처리 정리

··설명 약 6분·작성: 해비·블로그 소개

읽기 전에 알아두면 좋아요

아래 개념이 익숙하면 본문을 바로 읽으세요. 낯선 개념만 링크에서 복습하면 됩니다.

개념과 예제는 실행하지 않아도 읽을 수 있습니다. 내 컴퓨터·터미널에서 직접 실행하는 과정은 선택 실습입니다.

과정 위치와 선택 복습 안내

과정 위치: 준비와 기초 구현 · 문제

과정 위치는 이 글이 속한 묶음입니다. 이 단계의 모든 개념을 먼저 읽을 필요는 없습니다. 위에 연결한 개념 중 낯선 내용만 복습하세요. 문제의 조건·상태·갱신 순서는 익숙한 언어로 설명하면 됩니다.

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 분석입니다. 해답·해설은 아래에서 필요할 때 펼칠 수 있습니다.

0 / 6,000바이트

solution(numbers)에 자연수 7개 배열을 전달하며 [합,최솟값] 숫자 배열을 반환합니다. 입력은 문제의 유효한 범위를 만족합니다. 표준 입력·출력 없이 결과를 반환하세요. Tab은 다음 항목으로 이동합니다. 입력 영역 오른쪽 아래를 끌어 높이를 조절할 수 있습니다.

비밀키·개인정보는 입력하지 마세요. 코드는 이 페이지에만 유지됩니다.

해답·해설 보기
JavaScript 해답
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개 배열을 전달하며 [합,최솟값] 숫자 배열을 반환합니다. 입력은 문제의 유효한 범위를 만족합니다. 표준 입력·출력 없이 결과를 반환하세요.

숫자를 하나씩 확인하면 됩니다

  1. 합 sum은 0, 최솟값 minimum은 100에서 시작합니다.
  2. 2로 나눈 나머지가 1이면 홀수입니다. 합에 더하고, 지금까지의 최솟값과 비교해 작은 수를 남깁니다.
  3. 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개

이 글을 쓴 해비

웹사이트를 제작·운영하고, 개인 서비스와 자동화·AI 도구를 만듭니다. 직접 만들며 배운 내용과 문제 해결 과정을 BlogFlow에 기록합니다.

새 글 받아보기

RSS 리더에서 BlogFlow의 새 글을 확인할 수 있습니다.

RSS 피드 구독하기

댓글 남기기