보이는 학생 JavaScript 풀이

2026.09.13·약 4분·작성: 해비·블로그 소개

주요 요약

앞에서부터 학생의 키를 확인하면서 지금까지의 최댓값보다 큰 학생만 셉니다. 새로 보이는 학생을 만날 때마다 최댓값도 함께 갱신합니다.

문제

선생님 앞에 N명의 학생이 한 줄로 서 있습니다. 학생들의 키가 앞에서부터 주어질 때 선생님에게 보이는 학생 수를 구합니다. 어떤 학생이 보이려면 그 학생보다 앞에 있는 모든 학생보다 키가 커야 하며, 작거나 같은 경우에는 보이지 않습니다.

입력: 첫째 줄에 학생 수 N이 주어지고, 둘째 줄에 N명의 키가 앞에서부터 순서대로 주어집니다. N은 1 이상 1,000 이하입니다.

출력: 선생님이 볼 수 있는 학생 수를 출력합니다.

예제 입력 보이는 키 예제 출력
8
130 135 148 140 145 150 150 153
130, 135, 148, 150, 153 5

풀이와 정답

풀이와 정답 보기 (클릭)

현재 학생이 보이는지는 바로 앞 학생 한 명만으로 판단할 수 없습니다. 현재 위치보다 앞에 있는 학생 중 가장 큰 키와 비교해야 합니다. 따라서 첫 학생의 키를 maxHeight로 두고, 뒤의 학생을 차례대로 확인합니다.

현재 키가 maxHeight보다 크면 앞의 모든 학생보다 큰 것이므로 보이는 학생 수를 늘립니다. 이때 현재 키를 새로운 최댓값으로 저장합니다. 키가 같으면 문제 조건의 ‘크면 보인다’를 만족하지 않으므로 세지 않습니다.

알고리즘 설계

선생님의 시선에서 앞사람들보다 큰 학생이 보이는 원리를 나타낸 그림

  1. 맨 앞 학생은 항상 보이므로 개수를 1로 시작합니다.
  2. 맨 앞 학생의 키를 현재 최댓값으로 저장합니다.
  3. 두 번째 학생부터 최댓값보다 큰지 비교합니다.
  4. 더 크면 개수를 늘리고 최댓값을 현재 키로 갱신합니다.

예제에서는 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개)
  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 피드 구독하기

댓글 남기기