주요 요약
앞에서부터 학생의 키를 확인하면서 지금까지의 최댓값보다 큰 학생만 셉니다. 새로 보이는 학생을 만날 때마다 최댓값도 함께 갱신합니다.
문제
선생님 앞에 N명의 학생이 한 줄로 서 있습니다. 학생들의 키가 앞에서부터 주어질 때 선생님에게 보이는 학생 수를 구합니다. 어떤 학생이 보이려면 그 학생보다 앞에 있는 모든 학생보다 키가 커야 하며, 작거나 같은 경우에는 보이지 않습니다.
입력: 첫째 줄에 학생 수 N이 주어지고, 둘째 줄에 N명의 키가 앞에서부터 순서대로 주어집니다. N은 1 이상 1,000 이하입니다.
출력: 선생님이 볼 수 있는 학생 수를 출력합니다.
| 예제 입력 | 보이는 키 | 예제 출력 |
|---|---|---|
8 |
130, 135, 148, 150, 153 |
5 |
풀이와 정답
풀이와 정답 보기 (클릭)
현재 학생이 보이는지는 바로 앞 학생 한 명만으로 판단할 수 없습니다. 현재 위치보다 앞에 있는 학생 중 가장 큰 키와 비교해야 합니다. 따라서 첫 학생의 키를 maxHeight로 두고, 뒤의 학생을 차례대로 확인합니다.
현재 키가 maxHeight보다 크면 앞의 모든 학생보다 큰 것이므로 보이는 학생 수를 늘립니다. 이때 현재 키를 새로운 최댓값으로 저장합니다. 키가 같으면 문제 조건의 ‘크면 보인다’를 만족하지 않으므로 세지 않습니다.
알고리즘 설계

- 맨 앞 학생은 항상 보이므로 개수를 1로 시작합니다.
- 맨 앞 학생의 키를 현재 최댓값으로 저장합니다.
- 두 번째 학생부터 최댓값보다 큰지 비교합니다.
- 더 크면 개수를 늘리고 최댓값을 현재 키로 갱신합니다.
예제에서는 130, 135, 148이 차례대로 최댓값을 바꿉니다. 140과 145는 148보다 작아 보이지 않습니다. 첫 번째 150은 새 최댓값이지만, 다음 150은 같기 때문에 제외되고 마지막 153이 선택됩니다.
JavaScript 풀이

const fs = require("fs");
const input = fs.readFileSync(0, "utf8").trim().split(/\s+/).map(Number);
const count = input[0];
const heights = input.slice(1, count + 1);
let visibleCount = 1;
let maxHeight = heights[0];
for (let index = 1; index < heights.length; index += 1) {
if (heights[index] > maxHeight) {
visibleCount += 1;
maxHeight = heights[index];
}
}
console.log(visibleCount);
split(/\s+/)은 공백과 줄바꿈을 함께 구분하므로 LF와 CRLF 입력을 모두 처리합니다. trim()은 입력 문자열의 앞뒤 공백과 줄바꿈을 제거합니다. 입력의 첫 수만 N으로 사용하고 이어지는 N개의 값을 학생 키로 읽습니다.
복잡도와 검증
학생 N명을 한 번씩 확인하므로 시간 복잡도는 O(N)입니다. 입력 배열은 O(N) 공간을 사용하지만, 최댓값과 개수 등 풀이 자체의 추가 공간은 O(1)입니다.
| 검증 항목 | 입력 특징 | 기대 결과 |
|---|---|---|
| 원문 예제 | 증가·감소·같은 키가 섞임 | 5 |
| 학생 1명 | 비교 대상 없음 | 1 |
| 모두 증가 | 매번 새 최댓값 | 모든 학생이 보임 |
| 모두 감소 또는 동일 | 새 최댓값 없음 | 맨 앞 학생만 보임 |
현재 값과 직전 값만 비교하는 문제와의 차이는 큰 수 출력하기 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의 새 글을 확인할 수 있습니다.