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

2026.09.01·수정 2026.09.13·약 8분·작성: 해비·블로그 소개

먼저 직접 풀어보세요

문제 원문을 확인한 뒤 직접 풀이해 보세요. 해설과 정답은 아래 접힌 영역에서 확인할 수 있습니다.

문제

홀수

7개의 자연수가 주어질 때, 이들 중 홀수인 자연수들을 모두 골라 그 합을 구하고, 고른 홀수들 중 최솟값을 찾는 프로그램을 작성하세요. 예를 들어 12, 77, 38, 41, 53, 92, 85가 주어지면 홀수의 합은 256이고, 홀수 중 최솟값은 41입니다.

입력설명
첫 번째 줄에 자연수 7개가 주어집니다. 주어지는 자연수는 100보다 작습니다. 홀수가 한 개 이상 반드시 존재합니다.

출력설명
첫째 줄에 홀수들의 합을 출력하고, 둘째 줄에 홀수들 중 최솟값을 출력합니다.

입력예제 1
12 77 38 41 53 92 85

출력예제 1
256
41

출처: 한국정보올림피아드

추가 제한 사항

없음

풀이와 정답

풀이와 정답 보기 (클릭)

결론부터 말하면, 입력값을 숫자 배열로 바꾼 뒤 한 번 순회하면서 홀수만 골라 상태를 갱신하면 됩니다. 이 문제는 홀수가 한 개 이상 반드시 존재하므로, 홀수의 합을 저장하는 sum과 홀수 중 최솟값을 저장하는 minOdd만 정확히 관리하면 됩니다.

입력 처리에서는 fs.readFileSync(0, 'utf8')로 전체 입력을 읽고, trim, split, map을 조합해 숫자 배열로 변환합니다. 온라인 저지 환경에서는 줄 단위 입력과 공백 입력이 섞일 수 있으므로, 공백 전체를 기준으로 나누는 정규식 /\s+/을 사용하면 안정적입니다.

알고리즘 설계

값을 하나씩 판별해 홀수만 모으고 합계와 최솟값을 갱신하는 흐름

알고리즘은 세 단계로 충분합니다. 첫째, 입력 전체를 읽어 숫자 배열 numbers로 변환합니다. 둘째, 각 원소 num에 대해 num % 2 === 1인지 검사하고, 홀수라면 summinOdd를 갱신합니다. 셋째, 반복이 끝난 뒤 합과 최솟값을 차례로 출력합니다.

최솟값 갱신에는 구현이 간단한 Infinity를 사용할 수 있습니다. minOddInfinity로 시작하면, 홀수를 발견할 때마다 Math.min(minOdd, num)으로 현재까지의 최솟값을 유지할 수 있습니다. 문제 조건상 홀수가 반드시 있으므로 별도의 실패 출력 분기는 필요하지 않습니다.

  • numbers는 입력에서 읽은 숫자 목록입니다.
  • sum은 홀수로 판별된 값들의 누적 합입니다.
  • minOdd는 지금까지 확인한 홀수 중 가장 작은 값입니다.
  • num % 2 === 1은 현재 값이 홀수인지 확인하는 조건입니다.
for (const num of numbers) {
  if (num % 2 === 1) {
    sum += num;
    minOdd = Math.min(minOdd, num);
  }
}

제공된 코드의 min = 1000도 모든 입력이 100보다 작다는 원문 조건에서는 올바르게 동작합니다. 최종 풀이에서는 입력 범위가 바뀌어도 초기값에 의존하지 않도록 Infinity로 개선했으며, 알고리즘의 동작 방식과 복잡도는 그대로 유지됩니다.

이 반복 구조는 입력값을 한 번만 확인합니다. 각 숫자마다 수행하는 작업은 홀수 판별, 덧셈, 최솟값 비교 정도이므로 처리 흐름이 단순합니다. 초급 단계에서 중요한 부분은 홀수 판별 조건을 출력 조건과 섞지 않는 것입니다. 먼저 반복문에서 필요한 상태를 완성하고, 반복문 밖에서 최종 출력만 결정하면 코드가 훨씬 읽기 쉬워집니다.

JavaScript 풀이

입력값을 조건에 따라 선별하고 두 결과를 갱신해 출력하는 과정

아래 코드는 Node.js 실행 환경을 기준으로 한 JavaScript 풀이입니다. 입력 전체를 읽은 뒤 숫자 배열로 만들고, 홀수의 합과 최솟값을 함께 계산합니다. 문제에서 홀수가 한 개 이상 반드시 존재한다고 했으므로, 계산이 끝나면 합계와 최솟값을 줄바꿈으로 바로 출력하면 됩니다.

const fs = require('fs');

const input = fs.readFileSync(0, 'utf8').trim();
const numbers = input.split(/\s+/).map(Number);

let sum = 0;
let minOdd = Infinity;

for (const num of numbers) {
  if (num % 2 === 1) {
    sum += num;
    minOdd = Math.min(minOdd, num);
  }
}

console.log(`${sum}\n${minOdd}`);

input은 표준 입력에서 읽은 원문 문자열입니다. 이 문제는 자연수 7개가 반드시 주어지므로 trim() 후 공백 기준으로 나누어 숫자로 변환하면 충분합니다.

sum은 처음에 0으로 시작합니다. 홀수를 발견할 때마다 sum += num을 실행하므로, 반복이 끝나면 홀수만의 합이 남습니다. 짝수는 if 조건을 통과하지 못하므로 어떤 계산에도 포함되지 않습니다. 이렇게 조건문 안에 갱신 로직을 모아 두면 짝수가 결과에 섞이는 실수를 줄일 수 있습니다.

minOddInfinity로 시작합니다. 첫 번째 홀수를 만나면 Math.min(Infinity, num)의 결과가 num이 되므로 자연스럽게 초기화됩니다. 이후 더 작은 홀수를 만나면 그 값으로 바뀌고, 더 큰 홀수를 만나면 기존 값이 유지됩니다. 이 방식은 별도의 isFirstOdd 같은 변수를 만들지 않아도 홀수 존재 여부와 최솟값을 함께 다룰 수 있다는 장점이 있습니다.

반복이 끝나면 sum에는 홀수들의 합이, minOdd에는 홀수 중 최솟값이 남습니다. 따라서 문제의 출력 형식에 맞게 두 값을 줄바꿈으로 출력하면 됩니다.

복잡도와 검증

이 풀이의 시간 복잡도는 입력 숫자의 개수를 N이라고 할 때 O(N)입니다. numbers를 한 번 순회하면서 각 원소마다 나머지 연산과 상수 시간 갱신만 수행하기 때문입니다. 입력 크기가 커져도 반복 횟수는 숫자 개수에 비례해서 늘어나므로, 기본적인 수 처리 문제에 적합한 구조입니다.

공간 복잡도는 입력을 배열 numbers로 저장하므로 O(N)으로 볼 수 있습니다. 추가 상태로 사용하는 summinOdd는 입력 크기와 무관하게 하나씩만 유지되므로 O(1)입니다. 만약 입력을 줄 단위로 스트리밍 처리할 수 있는 환경이라면 배열 저장을 줄일 여지도 있지만, 일반적인 Node.js 온라인 저지 풀이에서는 전체 입력을 한 번에 읽는 방식이 흔히 사용됩니다.

검증할 때는 홀수가 하나만 있는 입력과 여러 홀수와 짝수가 섞인 입력을 나누어 확인하면 됩니다. 홀수가 하나만 있는 경우에는 summinOdd가 같은 값이 됩니다. 여러 홀수가 있는 경우에는 모든 홀수가 sum에 포함되고, 그중 가장 작은 값만 minOdd에 남아야 합니다.

핵심은 홀수 판별과 상태 갱신을 반복문 안에 모으고, 최종 출력은 반복문 밖에서 처리하는 것입니다. 이렇게 역할을 나누면 짝수를 합산하는 실수를 줄이고, 합계와 최솟값을 문제 형식에 맞게 깔끔하게 출력할 수 있습니다.

풀이 전에 확인할 순서

  1. 입력값과 출력값을 한 문장으로 다시 적습니다.
  2. 반복할 대상과 비교·저장할 값을 정합니다.
  3. 필요한 자료구조와 시간복잡도를 예상합니다.
  4. 코드를 보기 전에 손으로 작은 예제를 계산합니다.
힌트: 홀수 JavaScript 풀이: 조건 판별과 결과 처리 정리

정답 코드를 바로 따라 쓰기보다, 본문에서 값이 갱신되는 조건과 반복 범위를 먼저 찾으세요. 반복 한 번마다 반드시 유지되어야 하는 값이 무엇인지 적으면 풀이의 중심 변수를 고르기 쉽습니다.

테스트 확인

  • 가능한 가장 작은 입력
  • 같은 값이나 문자가 반복되는 입력
  • 정답이 처음 또는 마지막 위치에서 결정되는 입력
  • 입력 제한에 가까운 경우의 실행 시간

확인 결과: 본문의 예제뿐 아니라 위 경계 사례에서도 예상값과 실제 출력이 같아야 풀이가 완료됩니다.

이 글이 도움이 되었나요?

조회 중

코딩테스트 JavaScript 학습 순서

필수 49개 · 전체 49개

읽음 기록 관리

전체 과정 목차 (49개)
  1. 필수 길잡이 · 코딩테스트 JS 자료구조 로드맵: 배열, 해시, 스택, 투 포인터 순서
  2. 필수 학습 · 세 수 중 최솟값 JavaScript 조건문 풀이 정리
  3. 필수 학습 · 삼각형 판별하기 JavaScript 풀이
  4. 필수 학습 · 연필 개수 JavaScript 풀이
  5. 필수 학습 · 1부터 N까지 합 출력하기 JavaScript 풀이
  6. 필수 학습 · 최솟값 구하기 JavaScript 풀이|배열 순회와 비교 갱신 원리
  7. 필수 학습 · 홀수 JavaScript 풀이: 조건 판별과 결과 처리 정리 현재 글
  8. 필수 학습 · 10부제 JavaScript 풀이: 끝자리 비교로 위반 차량 수 세기
  9. 필수 학습 · A를 #으로 JavaScript 풀이: 문자열 순회와 치환
  10. 필수 학습 · 문자 찾기 JavaScript 풀이: 문자열 순회로 개수 세기
  11. 필수 학습 · 대문자 찾기 JavaScript 풀이
  12. 필수 학습 · 대문자로 통일 JavaScript 풀이
  13. 필수 학습 · 대소문자 변환 JavaScript 풀이
  14. 필수 학습 · 일곱 난쟁이 JavaScript 풀이: 두 명을 제외하는 완전탐색
  15. 필수 학습 · 코딩테스트 JS Map 풀이: 학급 회장 득표수 세기
  16. 필수 학습 · 코딩테스트 JS 스택 풀이: 올바른 괄호 검증하기
  17. 필수 학습 · 코딩테스트 JS 스택 풀이: 괄호문자 제거하기
  18. 필수 학습 · 코딩테스트 JS 스택 풀이: 크레인 인형뽑기 처리법
  19. 필수 학습 · 코딩테스트 JS 스택 풀이: 후위식 연산 계산하기
  20. 필수 학습 · 코딩테스트 JS 스택 풀이: 쇠막대기 레이저 절단 개수 세기
  21. 필수 학습 · 코딩테스트 JS 투 포인터 풀이: 두 정렬 배열 합치기
  22. 필수 학습 · 코딩테스트 JS 투 포인터 풀이: 공통 원소 추출하기
  23. 필수 학습 · 코딩테스트 JS 슬라이딩 윈도우 풀이: 최대 매출 구간 합 계산하기
  24. 필수 학습 · JavaScript 투 포인터: 합이 M인 연속 부분수열 개수
  25. 필수 학습 · 코딩테스트 JS 해시 풀이: 모든 아나그램 찾기
  26. 필수 학습 · 가장 긴 문자열 JavaScript 풀이
  27. 필수 학습 · 가운데 문자 출력 JavaScript 풀이
  28. 필수 학습 · 중복문자제거 JavaScript 풀이
  29. 필수 학습 · 코딩테스트 JS 고급: 최소 힙으로 다익스트라 최단 경로 구하기
  30. 필수 학습 · 코딩테스트 JS Union-Find: 연결 성분 수와 크기 구하기
  31. 필수 학습 · 코딩테스트 JS Trie: 접두사에 맞는 단어 수 세기
  32. 필수 학습 · 코딩테스트 JS Fenwick Tree: 값 갱신과 구간 합 처리
  33. 필수 학습 · 코딩테스트 JS 세그먼트 트리: 단일 대입과 구간 합
  34. 필수 학습 · 코딩테스트 JS LRU 캐시: 지도 타일 재사용 기록
  35. 필수 학습 · 코딩테스트 JS AVL 트리: 기준 이상 최솟값 찾기
  36. 필수 학습 · 코딩테스트 JS 큐: 상담 창구 대기열 명령 처리
  37. 필수 학습 · 코딩테스트 JS 연결 리스트: 재생 대기 목록 관리
  38. 필수 학습 · JavaScript 원형 덱 연습: 최근 기록 창과 되돌리기
  39. 필수 학습 · JavaScript 해시 테이블 연습: 정규화 문자열 빈도와 등장 순서
  40. 필수 학습 · JavaScript 트리 순회 연습: 깊이별 노드 묶기
  41. 필수 학습 · JavaScript BST 연습: 닫힌 구간의 중복 키 보고서
  42. 필수 학습 · JavaScript 최소 힙 연습: 동률 순서를 지키는 작업 스케줄러
  43. 필수 학습 · JavaScript 그래프 연습: 연결 구역 크기를 작은 순서로 출력하기
  44. 필수 학습 · 중복단어제거 JavaScript 풀이
  45. 필수 학습 · TypeScript 이진 탐색 연습: 숫자 카드 존재 여부 확인
  46. 필수 학습 · 큰 수 출력하기 JavaScript 풀이
  47. 필수 학습 · 보이는 학생 JavaScript 풀이
  48. 필수 학습 · 가위바위보 JavaScript 풀이
  49. 필수 학습 · 점수계산 JavaScript 풀이

새 글 받아보기

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

RSS 피드 구독하기

댓글 남기기