보이는 학생 풀이

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

읽기 전에 알아두면 좋아요

아래 개념이 익숙하면 본문을 바로 읽으세요. 낯선 개념만 링크에서 복습하면 됩니다.

개념과 예제는 실행하지 않아도 읽을 수 있습니다. 내 컴퓨터·터미널에서 직접 실행하는 과정은 선택 실습입니다.

과정 위치와 선택 복습 안내

과정 위치: 준비와 기초 구현 · 문제

과정 위치는 이 글이 속한 묶음입니다. 이 단계의 모든 개념을 먼저 읽을 필요는 없습니다. 위에 연결한 개념 중 낯선 내용만 복습하세요. 문제의 조건·상태·갱신 순서는 익숙한 언어로 설명하면 됩니다.

JavaScript로 문법·실행 복습하기 (선택)

개념 글의 코드는 JavaScript 예시입니다. 문제 화면에서는 JavaScript·Python·Java·C++·C# 중 익숙한 언어의 함수를 작성하세요. 본문의 Node.js 입출력 예시는 로컬 실행을 위한 별도 안내입니다.

보이는 학생 문제에서는 학생들의 키를 입력받아 무엇의 수를 구하나요?

학생들의 키를 입력받아 앞에서 보이는 학생 수를 구하는 문제입니다. 배열·조건문·최댓값의 기본을 준비하고, 아래 입력·반환 계약을 확인해 직접 풀어보세요.

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

공식 문서 참고: 관련 개념: MDN 최댓값과의 엄격한 크기 비교

문제

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

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

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

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

직접 풀어보기

먼저 선택한 언어의 입력·반환 계약에 맞춰 작성해 보세요. 힌트 받기와 정답과 비교하기는 코드를 실행하지 않는 AI 분석입니다. 해답·해설은 아래에서 필요할 때 펼칠 수 있습니다.

0 / 6,000바이트

입력 예시 전체를 문자열로 전달하고 출력 문자열을 반환합니다. solve(input)를 호출합니다. 표준 입력·출력 코드는 추가하지 않습니다. 입력 공백과 LF/CRLF 줄바꿈을 처리합니다. Tab은 다음 항목으로 이동합니다. 입력 영역 오른쪽 아래를 끌어 높이를 조절할 수 있습니다.

비밀키·개인정보는 입력하지 마세요. 코드는 이 페이지에만 유지됩니다.

해답·해설 보기
JavaScript 해답
function solve(input) {
    const t = input.trim().split(/\s+/).map(Number);
    const n = t[0], a = t.slice(1, n + 1);
    let count = 1, highest = a[0];
    for (let i = 1; i < n; i++) if (a[i] > highest) {
        count++;
        highest = a[i];
    }
    return String(count);
}

입력 예시 전체를 문자열로 전달하고 출력 문자열을 반환합니다. solve(input)를 호출합니다. 표준 입력·출력 코드는 추가하지 않습니다. 입력 공백과 LF/CRLF 줄바꿈을 처리합니다.

원자료와 확인 범위

2026-10-12에 제공된 학습 자료 섹션 2. 1, 2차원 탐색.pdf의 2쪽 ‘보이는 학생’와 문제 조건·예제를 대조했습니다. 같은 ZIP의 해당 문제 TXT는 풀이 코드 자료입니다. 이 자료의 최초 출제 원문·저자·공개 배포 주소까지 확인한 것은 아닙니다.

이번 대조는 원자료의 문제 조건과 예제 확인입니다. 이 글의 전체 코드를 새로 실행하거나 공식 채점에 제출한 결과를 뜻하지 않습니다. 아래 예제·자가 확인 항목은 직접 실행해 기대 출력과 비교하는 기준입니다.

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

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

알고리즘 설계

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

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

예제에서는 130, 135, 148이 차례대로 최댓값을 바꿉니다. 140과 145는 148보다 작아 보이지 않습니다. 첫 번째 150은 새 최댓값이지만, 다음 150은 같기 때문에 제외되고 마지막 153이 선택됩니다.

배열 순회와 최댓값 변수의 갱신을 알고 있다면 이전 풀이 파일 없이 시작할 수 있습니다. 아래 전체 코드를 Node.js의 solution.cjs 파일로 저장하고, 예제의 학생 수 8과 키 여덟 개를 UTF-8 input.txt에 넣습니다. PowerShell 7에서는 Get-Content -Raw -Encoding UTF8 ./input.txt | node ./solution.cjs로, Bash·명령 프롬프트에서는 node solution.cjs < input.txt로 입력을 전달합니다. 예제의 보이는 학생 수 5와 비교하고 같은 키 150을 두 번 세지 않았는지 추적합니다. 이번 편집에서는 명령을 실행하지 않았습니다.

학생 키를 순서대로 확인하며 새로운 최댓값을 결과에 남기는 과정

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 풀이에서 함께 비교해 보실 수 있습니다.

이 문제를 푼 뒤 확인하기

같은 키의 학생과 가장 큰 키가 마지막에 나오는 경우를 각각 세어 보세요.

본문의 예제와 이 반례를 직접 실행해 예상 출력과 비교하고, 결과가 다르면 입력 조건과 반복 범위를 다시 확인하세요.

글 소개·학습 준비·전체 목차

주요 요약

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

이 글이 도움이 되었나요?

조회 중

이어서 공부하기

체크포인트: 해설을 가리고 다시 풀고, 경계 입력을 하나 바꾸어 예상 결과와 실제 결과를 비교하세요. 직전 값과 지금까지의 최댓값을 구분하고, 초기값과 갱신 순서를 손으로 추적하세요.

다음 추천 · 문제: 가위바위보 풀이

같은 주제의 문제에 적용하며 방금 배운 개념을 확인합니다.

권장 순서는 학습 가이드와 같습니다. 다른 순서는 접힌 참고 목록에서 확인할 수 있습니다. 읽음 표시는 숙달이나 채점 결과가 아닙니다.

원래 과정 목록 순서 (선택)

읽음 기록

읽음 — / 전체 58개 · 필수 58개

이 글을 쓴 해비

웹사이트를 제작·운영하고, 개인 서비스와 자동화·AI 도구를 만듭니다. 직접 만들며 배운 내용과 문제 해결 과정을 BlogFlow에 기록합니다.

새 글 받아보기

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

RSS 피드 구독하기

댓글 남기기