7개의 수를 한 번씩 확인하며 현재 최솟값을 갱신하는 기본 배열 탐색 문제입니다. 해설과 정답은 아래 접힌 영역에서 확인할 수 있습니다.
문제
한 줄에 주어진 7개의 수를 모두 확인하여 가장 작은 값을 출력하는 문제입니다. 숫자의 전체 순서를 구할 필요는 없으며, 최솟값 하나만 정확하게 찾으면 됩니다.
입력은 7개의 수가 공백으로 구분되어 주어지고, 출력은 그중 가장 작은 값 하나입니다. 각 수의 범위는 문제에 별도로 제시되어 있지 않으므로 임의의 범위를 가정하지 않습니다.
5 3 7 11 2 15 17
예제 출력
2
풀이와 정답
풀이와 정답 보기 (클릭)
정렬 없이 한 번의 순회로 해결할 수 있습니다. 첫 번째 수를 임시 최솟값으로 정한 뒤 남은 수를 왼쪽에서 오른쪽으로 비교합니다. 현재 수가 임시 최솟값보다 작을 때만 값을 바꾸면 마지막에는 전체 최솟값이 남습니다.
정렬한 뒤 첫 번째 원소를 선택하는 방법도 결과는 같지만, 이 문제는 전체 순서가 아니라 최솟값 하나만 요구합니다. 모든 원소의 순서를 새로 정하는 작업은 필요하지 않으므로 비교와 갱신만 수행하는 순차 탐색이 문제의 목표에 더 직접적으로 맞습니다.
순차 탐색은 입력 배열의 순서를 바꾸지 않는다는 장점도 있습니다. 원본 순서가 이후 처리에 필요하더라도 그대로 보존되며, 최솟값을 찾기 위한 상태도 하나뿐이라 풀이 흐름을 추적하기 쉽습니다.
알고리즘 설계

알고리즘이 유지해야 하는 상태는 minValue 하나입니다. 반복문의 각 시점에서 minValue는 지금까지 확인한 수 중 가장 작은 값을 뜻합니다. 첫 번째 수를 넣어 시작하면 첫 번째 수까지만 본 시점의 조건은 자연스럽게 성립합니다.
문제에 숫자 범위가 명시되지 않았으므로 특정한 큰 상수를 초기값으로 정하는 방식은 피하는 편이 안전합니다. 실제 입력의 첫 값을 사용하면 범위를 추측할 필요가 없고, 모든 비교 대상이 같은 기준 안에서 처리됩니다.
두 번째 수부터는 현재 수와 minValue를 비교합니다. 현재 수가 더 작으면 새로운 최솟값을 발견한 것이므로 갱신하고, 더 크거나 같으면 기존 값을 유지합니다. 이 판단을 일곱 번째 수까지 반복하면 확인 범위가 전체 입력으로 넓어지므로 저장된 값이 최종 정답이 됩니다.
- 입력된 7개의 수를 숫자 배열로 만듭니다.
- 배열의 첫 번째 값을 현재 최솟값으로 초기화합니다.
- 두 번째 값부터 마지막 값까지 순서대로 비교합니다.
- 더 작은 값이 발견될 때만 현재 최솟값을 갱신합니다.
- 순회가 끝나면 현재 최솟값을 출력합니다.
예제에서는 5로 시작한 뒤 3을 만나 처음 갱신됩니다. 7과 11에서는 그대로 유지되고, 2에서 다시 갱신됩니다. 이후 15와 17은 더 크므로 최종 결과는 2입니다.
let minValue = numbers[0];
for (let i = 1; i < numbers.length; i++) {
if (numbers[i] < minValue) {
minValue = numbers[i];
}
}
JavaScript 풀이

제공된 입력 형식은 한 줄에 7개의 수가 바로 주어지는 방식입니다. 첫 번째 값이 원소 개수라는 설명은 없으므로 모든 입력값을 비교 대상에 포함해야 합니다. Node.js 환경에서는 표준 입력을 문자열로 읽고 공백 기준으로 나눈 다음 Number로 변환합니다.
const fs = require('fs');
const input = fs.readFileSync(0, 'utf8').trim();
if (input.length === 0) {
process.exit(0);
}
const numbers = input.split(/\s+/).map(Number);
let minValue = numbers[0];
for (let i = 1; i < numbers.length; i++) {
if (numbers[i] < minValue) {
minValue = numbers[i];
}
}
console.log(minValue);
빈 문자열일 때 종료하는 분기는 정상적인 7개 입력에서는 실행되지 않지만, 입력이 없는 환경에서 numbers[0]을 참조하는 상황을 막아 줍니다. 유효한 입력에 대한 알고리즘 흐름과 출력에는 영향을 주지 않습니다.
trim()은 입력 앞뒤의 불필요한 공백과 줄바꿈을 제거합니다. 이어서 split(/\s+/)은 하나 이상의 공백이나 줄바꿈을 기준으로 값을 나누고, map(Number)는 비교 가능한 숫자로 변환합니다.
minValue를 임의의 큰 숫자로 시작하지 않고 배열의 첫 번째 값으로 초기화하면 입력 범위를 몰라도 안전하게 비교할 수 있습니다. 반복문을 인덱스 1부터 시작하는 이유는 첫 번째 값이 이미 초기값으로 사용되었기 때문입니다.
조건식은 현재 원소가 저장된 최솟값보다 작은 경우만 처리합니다. 같은 값이 다시 등장하면 갱신하지 않아도 결과는 같고, 더 큰 값은 최솟값 후보가 될 수 없으므로 건너뜁니다. 반복이 끝난 뒤 한 번만 출력하므로 문제의 출력 형식과도 일치합니다.
복잡도와 검증
입력된 수의 개수를 n이라고 하면 첫 번째 값을 제외한 나머지를 한 번씩 비교하므로 비교 횟수는 최대 n - 1번입니다. 따라서 시간 복잡도는 O(n)입니다. 이 문제에서는 n이 7로 고정되어 있지만, 같은 풀이를 더 큰 배열에 적용해도 선형으로 증가합니다.
정렬을 사용하면 일반적으로 O(n log n)의 시간이 필요하고 입력 순서도 바뀔 수 있습니다. 순차 탐색은 정답에 필요한 비교만 수행하므로 이 문제에서는 시간과 목적 모두에 더 알맞습니다.
표준 입력을 숫자 배열로 저장하므로 배열에 필요한 공간은 O(n)입니다. 최솟값을 찾는 반복 과정에서 별도로 사용하는 값은 minValue와 반복 인덱스뿐이므로, 입력 배열을 제외한 추가 공간은 O(1)입니다.
예제 입력에서는 2가 출력되는 것을 확인할 수 있습니다. 또한 최솟값이 첫 번째에 있는 경우, 마지막에 있는 경우, 같은 최솟값이 여러 번 등장하는 경우, 7개의 값이 모두 같은 경우에도 동일한 비교 규칙으로 올바른 값이 유지됩니다. 이 네 경우는 최솟값의 위치와 중복 여부가 달라져도 알고리즘이 영향을 받지 않는지 확인하는 데 적합합니다.
중요한 점은 입력에 있는 7개의 수를 모두 비교 대상으로 사용하는 것입니다. 입력 개수를 별도의 첫 값으로 잘못 해석하면 실제 첫 번째 수가 비교에서 빠질 수 있으므로, 문제에 명시된 입력 형식을 그대로 따르는 것이 필요합니다.
같이 읽으면 좋은 글
구현 원리로 돌아가기
풀이에 사용한 자료구조를 왜 선택하는지, 코드의 동작과 연산 비용을 함께 복습하세요.
풀이 전에 확인할 순서
- 입력값과 출력값을 한 문장으로 다시 적습니다.
- 반복할 대상과 비교·저장할 값을 정합니다.
- 필요한 자료구조와 시간복잡도를 예상합니다.
- 코드를 보기 전에 손으로 작은 예제를 계산합니다.
힌트: 최솟값 구하기 JavaScript 풀이|배열 순회와 비교 갱신 원리
정답 코드를 바로 따라 쓰기보다, 본문에서 값이 갱신되는 조건과 반복 범위를 먼저 찾으세요. 반복 한 번마다 반드시 유지되어야 하는 값이 무엇인지 적으면 풀이의 중심 변수를 고르기 쉽습니다.
테스트 확인
- 가능한 가장 작은 입력
- 같은 값이나 문자가 반복되는 입력
- 정답이 처음 또는 마지막 위치에서 결정되는 입력
- 입력 제한에 가까운 경우의 실행 시간
확인 결과: 본문의 예제뿐 아니라 위 경계 사례에서도 예상값과 실제 출력이 같아야 풀이가 완료됩니다.
이 글이 도움이 되었나요?
코딩테스트 JavaScript 학습 순서
필수 49개 · 전체 49개
읽음 기록 관리
전체 과정 목차 (49개)
- 필수 길잡이 · 코딩테스트 JS 자료구조 로드맵: 배열, 해시, 스택, 투 포인터 순서
- 필수 학습 · 세 수 중 최솟값 JavaScript 조건문 풀이 정리
- 필수 학습 · 삼각형 판별하기 JavaScript 풀이
- 필수 학습 · 연필 개수 JavaScript 풀이
- 필수 학습 · 1부터 N까지 합 출력하기 JavaScript 풀이
- 필수 학습 · 최솟값 구하기 JavaScript 풀이|배열 순회와 비교 갱신 원리 현재 글
- 필수 학습 · 홀수 JavaScript 풀이: 조건 판별과 결과 처리 정리
- 필수 학습 · 10부제 JavaScript 풀이: 끝자리 비교로 위반 차량 수 세기
- 필수 학습 · A를 #으로 JavaScript 풀이: 문자열 순회와 치환
- 필수 학습 · 문자 찾기 JavaScript 풀이: 문자열 순회로 개수 세기
- 필수 학습 · 대문자 찾기 JavaScript 풀이
- 필수 학습 · 대문자로 통일 JavaScript 풀이
- 필수 학습 · 대소문자 변환 JavaScript 풀이
- 필수 학습 · 일곱 난쟁이 JavaScript 풀이: 두 명을 제외하는 완전탐색
- 필수 학습 · 코딩테스트 JS Map 풀이: 학급 회장 득표수 세기
- 필수 학습 · 코딩테스트 JS 스택 풀이: 올바른 괄호 검증하기
- 필수 학습 · 코딩테스트 JS 스택 풀이: 괄호문자 제거하기
- 필수 학습 · 코딩테스트 JS 스택 풀이: 크레인 인형뽑기 처리법
- 필수 학습 · 코딩테스트 JS 스택 풀이: 후위식 연산 계산하기
- 필수 학습 · 코딩테스트 JS 스택 풀이: 쇠막대기 레이저 절단 개수 세기
- 필수 학습 · 코딩테스트 JS 투 포인터 풀이: 두 정렬 배열 합치기
- 필수 학습 · 코딩테스트 JS 투 포인터 풀이: 공통 원소 추출하기
- 필수 학습 · 코딩테스트 JS 슬라이딩 윈도우 풀이: 최대 매출 구간 합 계산하기
- 필수 학습 · JavaScript 투 포인터: 합이 M인 연속 부분수열 개수
- 필수 학습 · 코딩테스트 JS 해시 풀이: 모든 아나그램 찾기
- 필수 학습 · 가장 긴 문자열 JavaScript 풀이
- 필수 학습 · 가운데 문자 출력 JavaScript 풀이
- 필수 학습 · 중복문자제거 JavaScript 풀이
- 필수 학습 · 코딩테스트 JS 고급: 최소 힙으로 다익스트라 최단 경로 구하기
- 필수 학습 · 코딩테스트 JS Union-Find: 연결 성분 수와 크기 구하기
- 필수 학습 · 코딩테스트 JS Trie: 접두사에 맞는 단어 수 세기
- 필수 학습 · 코딩테스트 JS Fenwick Tree: 값 갱신과 구간 합 처리
- 필수 학습 · 코딩테스트 JS 세그먼트 트리: 단일 대입과 구간 합
- 필수 학습 · 코딩테스트 JS LRU 캐시: 지도 타일 재사용 기록
- 필수 학습 · 코딩테스트 JS AVL 트리: 기준 이상 최솟값 찾기
- 필수 학습 · 코딩테스트 JS 큐: 상담 창구 대기열 명령 처리
- 필수 학습 · 코딩테스트 JS 연결 리스트: 재생 대기 목록 관리
- 필수 학습 · JavaScript 원형 덱 연습: 최근 기록 창과 되돌리기
- 필수 학습 · JavaScript 해시 테이블 연습: 정규화 문자열 빈도와 등장 순서
- 필수 학습 · JavaScript 트리 순회 연습: 깊이별 노드 묶기
- 필수 학습 · JavaScript BST 연습: 닫힌 구간의 중복 키 보고서
- 필수 학습 · JavaScript 최소 힙 연습: 동률 순서를 지키는 작업 스케줄러
- 필수 학습 · JavaScript 그래프 연습: 연결 구역 크기를 작은 순서로 출력하기
- 필수 학습 · 중복단어제거 JavaScript 풀이
- 필수 학습 · TypeScript 이진 탐색 연습: 숫자 카드 존재 여부 확인
- 필수 학습 · 큰 수 출력하기 JavaScript 풀이
- 필수 학습 · 보이는 학생 JavaScript 풀이
- 필수 학습 · 가위바위보 JavaScript 풀이
- 필수 학습 · 점수계산 JavaScript 풀이
새 글 받아보기
RSS 리더에서 BlogFlow의 새 글을 확인할 수 있습니다.