읽기 전에 알아두면 좋아요
아래 개념이 익숙하면 본문을 바로 읽으세요. 낯선 개념만 링크에서 복습하면 됩니다.
- 기초 구현 패턴: 조건·정수 계산·순회·상태 갱신변수에 값을 담고 조건에 따라 합·개수·최솟값을 갱신하는 기초부터 확인합니다. 세 값의 비교와 갱신, 동점과 초기값을 확인합니다.
개념과 예제는 실행하지 않아도 읽을 수 있습니다. 내 컴퓨터·터미널에서 직접 실행하는 과정은 선택 실습입니다.
과정 위치와 선택 복습 안내
과정 위치: 준비와 기초 구현 · 문제
과정 위치는 이 글이 속한 묶음입니다. 이 단계의 모든 개념을 먼저 읽을 필요는 없습니다. 위에 연결한 개념 중 낯선 내용만 복습하세요. 문제의 조건·상태·갱신 순서는 익숙한 언어로 설명하면 됩니다.
JavaScript로 문법·실행 복습하기 (선택)
개념 글의 코드는 JavaScript 예시입니다. 문제 화면에서는 JavaScript·Python·Java·C++·C# 중 익숙한 언어의 함수를 작성하세요. 본문의 Node.js 입출력 예시는 로컬 실행을 위한 별도 안내입니다.
세 수 중 최솟값 문제의 자연수 범위와 정렬 사용 조건은 무엇인가요?
100 이하의 자연수 세 개에서 가장 작은 값을 구하는 문제입니다. 정렬을 사용하지 않는 조건을 확인하세요. 변수·조건문·함수의 반환값의 기본을 준비하고, 아래 입력·반환 계약을 확인해 직접 풀어보세요.
적용 조건·범위: 이 글은 세 수 중 최솟값 JavaScript 풀이를 기준으로, 문제 조건을 어떻게 코드로 옮기는지 차례대로 정리합니다. 입력은 100 이하의 자연수 세 개이고, 출력은 그중 가장 작은 값 하나입니다. 조건에서 정렬을 사용하지 말라고 했으므로 배열을 오름차순으로 정렬한 뒤 첫 번째 값을 고르는 방식은 피해야 합니다.
공식 문서 참고: 관련 개념: MDN if·else로 비교 결과에 따라 값 선택
문제
문제 설명
100이하의 자연수 A, B, C를 입력받아 세 수 중 가장 작은 값을 출력하는 프로그램을 작성하세요. (정렬을 사용하면 안됩니다.)
입력 설명
첫 번째 줄에 100이하의 세 자연수가 입력됩니다.
출력 설명
첫 번째 줄에 가장 작은 수를 출력합니다.
입력 예제 1
6 5 11
출력 예제 1
5
추가 제한 사항
직접 풀어보기
먼저 선택한 언어의 입력·반환 계약에 맞춰 작성해 보세요. 힌트 받기와 정답과 비교하기는 코드를 실행하지 않는 AI 분석입니다. 해답·해설은 아래에서 필요할 때 펼칠 수 있습니다.
AI 힌트
코드를 실행한 채점 결과가 아닌 AI의 코드 분석입니다.
해답·해설 보기
function solution(a, b, c) {
let best = a < b ? a : b;
if (c < best) best = c;
return best;
}
solution(a, b, c)에 a(정수), b(정수), c(정수)를 전달하고 정수를 반환합니다. 아래 문제의 유효 입력 조건을 따릅니다. 표준 입력과 출력 코드는 작성하지 않습니다.
def solution(a, b, c):
best = a if a < b else b
if c < best:
best = c
return best
solution(a, b, c)에 a(정수), b(정수), c(정수)를 전달하고 정수를 반환합니다. 아래 문제의 유효 입력 조건을 따릅니다. 표준 입력과 출력 코드는 작성하지 않습니다.
import java.util.*;
class Solution {
public int solution(int a, int b, int c) {
int best = a < b ? a : b;
if (c < best) best = c;
return best;
}
}
Solution.solution(int a, int b, int c)에 a(정수), b(정수), c(정수)를 전달하고 정수를 반환합니다. 아래 문제의 유효 입력 조건을 따릅니다. 표준 입력과 출력 코드는 작성하지 않습니다.
#include <algorithm>
#include <string>
#include <vector>
#include <map>
#include <stack>
#include <stdexcept>
int solution(int a, int b, int c) {
int best = a < b ? a : b;
if (c < best) best = c;
return best;
}
solution(a, b, c)에 a(정수), b(정수), c(정수)를 전달하고 정수를 반환합니다. 아래 문제의 유효 입력 조건을 따릅니다. 표준 입력과 출력 코드는 작성하지 않습니다.
using System;
using System.Collections.Generic;
public class Solution {
public int Solve(int a, int b, int c) {
int best = a < b ? a : b;
if (c < best) best = c;
return best;
}
}
Solution.Solve(int a, int b, int c)에 a(정수), b(정수), c(정수)를 전달하고 정수를 반환합니다. 아래 문제의 유효 입력 조건을 따릅니다. 표준 입력과 출력 코드는 작성하지 않습니다.
원자료와 확인 범위
2026-10-12에 제공된 학습 자료 섹션 1. 기본문제풀이.pdf의 1쪽 ‘세 수 중 최솟값’와 문제 조건·예제를 대조했습니다. 같은 ZIP의 해당 문제 TXT는 풀이 코드 자료입니다. 이 자료의 최초 출제 원문·저자·공개 배포 주소까지 확인한 것은 아닙니다.
이번 대조는 원자료의 문제 조건과 예제 확인입니다. 이 글의 전체 코드를 새로 실행하거나 공식 채점에 제출한 결과를 뜻하지 않습니다. 아래 예제·자가 확인 항목은 직접 실행해 기대 출력과 비교하는 기준입니다.
이 글은 세 수 중 최솟값 JavaScript 풀이를 기준으로, 문제 조건을 어떻게 코드로 옮기는지 차례대로 정리합니다. 입력은 100 이하의 자연수 세 개이고, 출력은 그중 가장 작은 값 하나입니다. 조건에서 정렬을 사용하지 말라고 했으므로 배열을 오름차순으로 정렬한 뒤 첫 번째 값을 고르는 방식은 피해야 합니다.
세 수만 비교하는 문제에서는 모든 값을 정렬할 필요가 없습니다. 필요한 정보는 전체 순서가 아니라 가장 작은 값 하나뿐입니다. 이 글에서는 문제 조건에 맞춰 조건문 비교로 최솟값을 갱신하는 흐름을 사용합니다.
입력 처리는 한 번만 정확히 해두면 됩니다. Node.js에서는 fs.readFileSync(0, 'utf8')로 표준 입력 전체를 문자열로 읽고, 앞뒤 공백을 제거한 뒤 공백 기준으로 나눕니다. 입력이 예제처럼 한 줄이어도 되고 줄바꿈이 섞여도 되도록 split(/\s+/)을 사용하며, 비교가 문자열 비교가 되지 않도록 map(Number)로 숫자 배열을 만듭니다.
알고리즘 설계

조건문으로 직접 설계하면 두 번의 비교로 충분합니다. 먼저 a와 b 중 작은 값을 정답 후보로 정하고, 그 후보와 c만 다시 비교합니다. 이 과정을 끝내면 정답 후보에는 세 수 중 최솟값만 남습니다.
이번 정답 코드에서는 먼저 a와 b 중 작은 값을 answer에 저장한 뒤, c가 현재 answer보다 작은지 한 번 더 확인합니다. 정렬 없이 필요한 비교만 수행하므로 문제 요구를 직접 충족합니다.
예를 들어 입력이 6 5 11이면 먼저 6과 5를 비교해 answer에 5를 저장합니다. 이어서 11이 5보다 작은지 확인하면 조건이 거짓이므로 정답은 그대로 5입니다. 세 값이 모두 같은 경우에도 첫 비교에서 선택된 값이 유지되므로 별도 예외 처리가 필요하지 않습니다.

JavaScript 조건문을 알고 Node.js가 준비되었다면 아래 전체 코드를 solution.cjs로 저장합니다. input.txt에는 6 5 11 한 줄을 넣습니다. Bash·명령 프롬프트는 node solution.cjs < input.txt, PowerShell은 cmd /c “node solution.cjs < input.txt”로 실행하며 기대 출력은 5입니다. 개수 3을 앞에 넣지 않고, 본문 변형처럼 최솟값이 첫째·둘째·셋째 위치인 경우도 같은 비교 규칙으로 확인하세요.
const fs = require('fs');
const [a, b, c] = fs
.readFileSync(0, 'utf8')
.trim()
.split(/\s+/)
.map(Number);
let answer;
if (a < b) answer = a;
else answer = b;
if (c < answer) answer = c;
console.log(answer);
코드 흐름 설명
const [a, b, c]는 숫자로 변환된 입력의 첫 세 값을 각각의 변수에 담는 부분입니다. 첫 번째 조건문은 a와 b 중 작은 값을 answer에 저장하고, 두 번째 조건문은 c가 그 값보다 작을 때만 정답을 갱신합니다.
console.log(answer)는 계산한 최솟값을 출력합니다. 출력 설명에서 첫 번째 줄에 가장 작은 수를 출력하라고 했으므로, 추가 문장이나 배열 형태가 아니라 숫자 하나만 출력해야 합니다. 이처럼 입력, 계산, 출력의 단계를 분리하면 초급 문제에서도 실수를 줄일 수 있습니다.
더 짧게 쓰고 싶다면 Math.min(a, b, c)도 가능하지만, 여기서는 조건문 풀이에 집중합니다. 핵심은 세 값의 전체 순서를 만들지 않고 필요한 최솟값만 구하는 것입니다.
복잡도와 검증
비교 대상은 항상 세 개로 고정되어 있습니다. 따라서 입력 크기가 커질 여지가 없고, 실행 시간은 상수 시간인 O(1)입니다. 별도의 배열 정렬이나 반복적인 탐색을 하지 않으므로 문제 조건에 비해 충분히 단순한 풀이입니다.
메모리 사용량도 input 배열과 세 변수, 정답 변수 정도만 필요하므로 O(1)로 볼 수 있습니다. 세 자연수만 다루기 때문에 큰 자료구조가 필요하지 않습니다. 정렬을 사용하면 문제 조건에 맞지 않을 뿐 아니라, 이 문제에서는 불필요한 작업도 늘어납니다.
예제 입력 6 5 11은 수동으로 따라가면 6과 5 중 5가 정답 후보가 되고, 11은 그보다 작지 않으므로 최종값은 5입니다. 경계값도 같은 방식으로 확인할 수 있습니다. 예를 들어 1 100 100이면 1, 100 1 100이면 1, 100 100 1이면 1이 출력되어 최솟값의 위치가 어디에 있어도 올바르게 처리됩니다.
이 문제를 푼 뒤 확인하기
유효한 입력 범위에서 7 7 7의 결과는 7, 100 100 1의 결과는 1인지 확인하세요. 자연수 문제이므로 음수는 필수 검증 입력이 아닙니다.
본문의 예제와 이 반례를 직접 실행해 예상 출력과 비교하고, 결과가 다르면 입력 조건과 반복 범위를 다시 확인하세요.
이 글이 도움이 되었나요?
이어서 공부하기
체크포인트: 해설을 가리고 다시 풀고, 경계 입력을 하나 바꾸어 예상 결과와 실제 결과를 비교하세요. 직전 값과 지금까지의 최댓값을 구분하고, 초기값과 갱신 순서를 손으로 추적하세요.
다음 추천 · 문제: 삼각형 판별하기 풀이
권장 순서는 학습 가이드와 같습니다. 다른 순서는 접힌 참고 목록에서 확인할 수 있습니다. 읽음 표시는 숙달이나 채점 결과가 아닙니다.
원래 과정 목록 순서 (선택)
읽음 기록
읽음 — / 전체 57개 · 필수 57개
새 글 받아보기
RSS 리더에서 BlogFlow의 새 글을 확인할 수 있습니다.