{ }codelper
목록에 넣기P0374

재시험 볼 학생 번호

학생 n명이 쪽지 시험을 보았다. 학생 번호는 점수가 주어진 차례대로 1번, 2번, …, n번이다. 점수가 c점 미만인 학생은 재시험을 본다. 첫 줄에 n과 c가 빈칸 하나로 띄워 주어진다. 둘째 줄에 점수 n개가 빈칸 하나로 띄워 주어진다. 첫 줄에 재시험을 보는 학생 수를 출력하라. 둘째 줄에 그 학생들의 번호를 작은 것부터 빈칸 하나로 띄워 출력하라. 재시험을 보는 학생이 없으면 첫 줄에 0만 출력하고, 둘째 줄은 출력하지 않는다.

입력
1 ≤ n ≤ 100, 0 ≤ c ≤ 100, 0 ≤ 점수 ≤ 100(모두 정수)
출력
첫 줄에 재시험을 보는 학생 수, 둘째 줄에 그 학생들의 번호(없으면 첫 줄만)
예시 1 · stdin
5 60
70 45 60 59 90
stdout
2
2 4
예시 2 · stdin
3 50
50 80 100
stdout
0
main.py
입력(stdin)

실행하면 이 줄들이 차례로 input()·표준 입력으로 들어가요(실행 중에 묻지 않아요).

$ 준비됐어요

코드를 입력해 풀려면 PC에서 열어 주세요. 모바일에서는 문제와 풀이를 볼 수 있어요.

다른 언어로는?언어별 풀이 보기 · 8개 언어 풀이

학생 수를 번호보다 먼저 출력해야 해서, 번호를 찾는 대로 바로 쓸 수 없고 빈 목록에 하나씩 모아 두어야 해요.
목록 끝에 하나를 넣는 이름이 언어마다 달라요.
Python append, JS·TS push, Java ArrayList의 add, C# List의 Add, C++ vector의 push_back, 크레이콘 넣기.
C의 배열은 늘어나지 않아서 풀이는 100칸을 미리 잡고 몇 칸 찼는지 따로 세요.
함정 하나: 넣은 결과를 목록에 다시 담으면 목록을 잃어요.
Python retake = retake.append(…)는 append가 None을 돌려주어서 예시 1의 둘째 학생을 넣을 때 AttributeError로 멈추고, JS retake = retake.push(…)는 push가 새 길이를 돌려주어서 retake.push is not a function으로 멈춰요.
함정 둘: 자리 번호는 0부터 세니 i + 1을 넣어야 해요.
i를 넣으면 예시 1의 둘째 줄이 1 3이 돼요.
함정 셋: 미만은 <예요.
<=로 쓰면 예시 1에서 딱 60점인 3번도 들어가 3과 2 3 4가 나와요.
함정 넷: 번호가 아니라 점수를 넣으면 예시 1의 둘째 줄이 45 59가 돼요.

Pythonmain.py · 9 줄
n, c = map(int, input().split())scores = list(map(int, input().split()))retake = []                      # 빈 목록에서 시작한다for i in range(n):    if scores[i] < c:        retake.append(i + 1)     # 학생 번호는 1번부터print(len(retake))if retake:    print(*retake)
JavaScriptmain.js · 13 줄
const lines = require("fs").readFileSync(0, "utf8").split("\n");const [n, c] = lines[0].trim().split(/\s+/).map(Number);const scores = lines[1].trim().split(/\s+/).map(Number);const retake = []; // 빈 배열에서 시작한다for (let i = 0; i < n; i++) {  if (scores[i] < c) {    retake.push(i + 1); // 학생 번호는 1번부터  }}console.log(retake.length);if (retake.length > 0) {  console.log(retake.join(" "));}
TypeScriptmain.ts · 14 줄
import { readFileSync } from "node:fs";const lines: string[] = readFileSync(0, "utf8").split("\n");const [n, c]: number[] = lines[0].trim().split(/\s+/).map(Number);const scores: number[] = lines[1].trim().split(/\s+/).map(Number);const retake: number[] = []; // 빈 배열에서 시작한다for (let i = 0; i < n; i++) {  if (scores[i] < c) {    retake.push(i + 1); // 학생 번호는 1번부터  }}console.log(retake.length);if (retake.length > 0) {  console.log(retake.join(" "));}
JavaMain.java · 26 줄
import java.util.ArrayList;import java.util.List;import java.util.Scanner; public class Main {    public static void main(String[] args) {        Scanner sc = new Scanner(System.in);        int n = sc.nextInt(), c = sc.nextInt();        List<Integer> retake = new ArrayList<>();   // 빈 목록에서 시작한다        for (int i = 0; i < n; i++) {            int score = sc.nextInt();            if (score < c) {                retake.add(i + 1);   // 학생 번호는 1번부터            }        }        System.out.println(retake.size());        if (!retake.isEmpty()) {            StringBuilder line = new StringBuilder();            for (int number : retake) {                if (line.length() > 0) line.append(' ');                line.append(number);            }            System.out.println(line);        }    }}
C#Main.cs · 25 줄
using System;using System.Collections.Generic; class Program{    static void Main()    {        string[] head = Console.ReadLine().Split(' ', StringSplitOptions.RemoveEmptyEntries);        int n = int.Parse(head[0]), c = int.Parse(head[1]);        string[] parts = Console.ReadLine().Split(' ', StringSplitOptions.RemoveEmptyEntries);        var retake = new List<int>();   // 빈 목록에서 시작한다        for (int i = 0; i < n; i++)        {            if (int.Parse(parts[i]) < c)            {                retake.Add(i + 1);   // 학생 번호는 1번부터            }        }        Console.WriteLine(retake.Count);        if (retake.Count > 0)        {            Console.WriteLine(string.Join(" ", retake));        }    }}
C++main.cpp · 23 줄
#include <iostream>#include <vector> int main() {    int n, c;    std::cin >> n >> c;    std::vector<int> retake;   // 빈 vector에서 시작한다    for (int i = 0; i < n; i++) {        int score;        std::cin >> score;        if (score < c) {            retake.push_back(i + 1);   // 학생 번호는 1번부터        }    }    std::cout << retake.size() << "\n";    if (!retake.empty()) {        for (std::size_t k = 0; k < retake.size(); k++) {            if (k > 0) std::cout << " ";            std::cout << retake[k];        }        std::cout << "\n";    }}
Cmain.c · 26 줄
#include <stdio.h> int main(void) {    int n, c;    if (scanf("%d %d", &n, &c) != 2) return 0;    /* C의 배열은 늘어나지 않는다: 가장 많을 때(100명)만큼 잡아 두고, 몇 칸 찼는지 따로 센다 */    int retake[100];    int count = 0;    for (int i = 0; i < n; i++) {        int score;        if (scanf("%d", &score) != 1) return 0;        if (score < c) {            retake[count] = i + 1;   /* 학생 번호는 1번부터 */            count++;        }    }    printf("%d\n", count);    if (count > 0) {        for (int k = 0; k < count; k++) {            if (k > 0) printf(" ");            printf("%d", retake[k]);        }        printf("\n");    }    return 0;}
Craykonmain.cray · 17 줄
head = 콘솔.수들읽기();n = head[0];c = head[1];scores = 콘솔.수들읽기();retake = []; // 빈 목록에서 시작한다반복 (i = 0; i < n; i++){    만약 (scores[i] < c)    {        retake.넣기(i + 1); // 학생 번호는 1번부터    }}콘솔.쓰기(retake.개수);만약 (retake.개수 > 0){    콘솔.쓰기(retake); // 목록은 빈칸으로 이어서 쓴다}