{ }codelper
初期化したリスト数えるP0150

アンケート回答の縦棒グラフ

満足度アンケートで 1 点から k 点までのうち一つを選んでもらい、回答を n 個集めた。
一行目に n と k が、二行目に回答 n 個が空白一つずつで区切られて与えられる。
1 ~ k 以外の回答は無効とし、グラフに入れない。
点数ごとに回答の数を数えて縦棒グラフを出力する。
いちばん多い回答数を H とすると、棒の行は高さ H から 1 までの H 行で、いちばん上の行(高さ H)から出力する。
各棒の行は k 文字で、j 文字目は j 点の回答数がその行の高さ以上なら '#'、そうでなければ '.' である。
棒の行の後に点数の行 "12...k"(1 から k までの数字を空白なしでつないだもの)を出力する。
最後の行に無効な回答の数を出力する。
有効な回答が一つもなければ H は 0 なので、棒の行は出力しない。

入力
1 ≤ n ≤ 1000、1 ≤ k ≤ 9、0 ≤ 回答 ≤ 20(整数)
出力
H 行の棒の行、点数の行、無効な回答の数
例 1 · stdin
12 5
4 5 3 4 0 4 2 5 7 4 1 5
stdout
...#.
...##
...##
#####
12345
2
main.py
入力(stdin)

実行すると、これらの行が順に input()・標準入力に渡されます(実行中に入力を求めません)。

$ 準備完了

コードを入力して解くにはパソコンで開いてください。モバイルでは問題と解答を見られます。

ほかの言語では?言語別の解答を見る · 8 言語の解答

点数ごとに数える枠を 0 で埋めて作り、一つずつ数える問題です。
0 番目の枠が 1 点なので counts[r - 1] に足します。
埋めて作るのは Python [0] * k、JS・TS new Array(k).fill(0)、Java・C# new int[k](自動で 0)、C++ std::vector<int> counts(k, 0)、C int counts[9] = {0};(初期値がないとローカル配列はゴミの値で始まります)、Craykon 新リスト(k, 0)(韓国語 새목록(k, 0))です。
落とし穴その一:JS で new Array(k) だけだと枠が空なので、counts[r - 1]++ が undefined + 1 = NaN になり、エラーも出ません。
落とし穴その二:範囲を確かめないと 0 点の回答が counts[-1] になります。
Python は負の添字を後ろから数えるので、エラーなしで最後の枠(k 点)に足してしまい、C・C++ は配列の外を触ります(未定義動作)。
必ず先に 1 <= r <= k を確かめます(Python は連鎖比較、ほかは r >= 1 && r <= k)。
落とし穴その三:[0] * k に counts[r] で足すと k 点で IndexError です。
落とし穴その四:棒は回答数がその行の高さと同じときも塗るので >= です。
最大値は Python max(counts)、JS・TS Math.max(...counts)、C# counts.Max()、C++ *std::max_element(...)、Craykon は 数学.大きい方(韓国語 수학.큰수)で一つずつ比べます。

Pythonmain.py · 16 行
n, k = map(int, input().split())answers = list(map(int, input().split())) counts = [0] * k   # 0번 칸이 1점invalid = 0for r in answers:    if 1 <= r <= k:        counts[r - 1] += 1    else:        invalid += 1 top = max(counts)for level in range(top, 0, -1):   # 맨 위 줄부터    print("".join("#" if c >= level else "." for c in counts))print("".join(str(j) for j in range(1, k + 1)))print(invalid)
JavaScriptmain.js · 16 行
const [n, k, ...answers] = require("fs").readFileSync(0, "utf8").trim().split(/\s+/).map(Number); const counts = new Array(k).fill(0); // 0번 칸이 1점let invalid = 0;for (const r of answers) {  if (r >= 1 && r <= k) counts[r - 1]++;  else invalid++;} const out = [];for (let level = Math.max(...counts); level >= 1; level--) {  out.push(counts.map((c) => (c >= level ? "#" : ".")).join("")); // 맨 위 줄부터}out.push(counts.map((_, j) => j + 1).join(""));out.push(invalid);console.log(out.join("\n"));
TypeScriptmain.ts · 17 行
import { readFileSync } from "node:fs";const [n, k, ...answers]: number[] = readFileSync(0, "utf8").trim().split(/\s+/).map(Number); const counts: number[] = new Array<number>(k).fill(0); // 0번 칸이 1점let invalid = 0;for (const r of answers) {  if (r >= 1 && r <= k) counts[r - 1]++;  else invalid++;} const out: string[] = [];for (let level = Math.max(...counts); level >= 1; level--) {  out.push(counts.map((c) => (c >= level ? "#" : ".")).join("")); // 맨 위 줄부터}out.push(counts.map((_, j) => j + 1).join(""));out.push(String(invalid));console.log(out.join("\n"));
JavaMain.java · 26 行
import java.util.Scanner; public class Main {    public static void main(String[] args) {        Scanner sc = new Scanner(System.in);        int n = sc.nextInt(), k = sc.nextInt();        int[] counts = new int[k]; // Java의 int 배열은 0으로 채워져 있다. 0번 칸이 1점        int invalid = 0;        for (int i = 0; i < n; i++) {            int r = sc.nextInt();            if (r >= 1 && r <= k) counts[r - 1]++;            else invalid++;        }        int top = 0;        for (int c : counts) top = Math.max(top, c);         StringBuilder out = new StringBuilder();        for (int level = top; level >= 1; level--) { // 맨 위 줄부터            for (int c : counts) out.append(c >= level ? '#' : '.');            out.append('\n');        }        for (int j = 1; j <= k; j++) out.append(j);        out.append('\n').append(invalid).append('\n');        System.out.print(out);    }}
C#Main.cs · 30 行
using System;using System.Linq;using System.Text; class Program{    static void Main()    {        int k = int.Parse(Console.ReadLine().Trim().Split(' ')[1]);        int[] answers = Console.ReadLine().Split(' ', StringSplitOptions.RemoveEmptyEntries).Select(int.Parse).ToArray();         int[] counts = new int[k]; // C#의 int 배열은 0으로 채워져 있다. 0번 칸이 1점        int invalid = 0;        foreach (int r in answers)        {            if (r >= 1 && r <= k) counts[r - 1]++;            else invalid++;        }         var sb = new StringBuilder();        for (int level = counts.Max(); level >= 1; level--) // 맨 위 줄부터        {            foreach (int c in counts) sb.Append(c >= level ? '#' : '.');            sb.Append('\n');        }        for (int j = 1; j <= k; j++) sb.Append(j);        sb.Append('\n').Append(invalid).Append('\n');        Console.Write(sb);    }}
C++main.cpp · 26 行
#include <algorithm>#include <iostream>#include <string>#include <vector> int main() {    int n, k;    std::cin >> n >> k;    std::vector<int> counts(k, 0); // 0번 칸이 1점    int invalid = 0;    for (int i = 0; i < n; i++) {        int r;        std::cin >> r;        if (r >= 1 && r <= k) counts[r - 1]++;        else invalid++;    }    int top = *std::max_element(counts.begin(), counts.end());     std::string out;    for (int level = top; level >= 1; level--) { // 맨 위 줄부터        for (int c : counts) out += c >= level ? '#' : '.';        out += '\n';    }    for (int j = 1; j <= k; j++) out += std::to_string(j);    std::cout << out << "\n" << invalid << "\n";}
Cmain.c · 25 行
#include <stdio.h> int main(void) {    int n, k;    scanf("%d %d", &n, &k);    int counts[9] = {0}; /* = {0}이 없으면 지역 배열은 쓰레기 값으로 시작한다. 0번 칸이 1점 */    int invalid = 0;    for (int i = 0; i < n; i++) {        int r;        scanf("%d", &r);        if (r >= 1 && r <= k) counts[r - 1]++;        else invalid++;    }    int top = 0;    for (int j = 0; j < k; j++)        if (counts[j] > top) top = counts[j];     for (int level = top; level >= 1; level--) { /* 맨 위 줄부터 */        for (int j = 0; j < k; j++) putchar(counts[j] >= level ? '#' : '.');        putchar('\n');    }    for (int j = 1; j <= k; j++) printf("%d", j);    printf("\n%d\n", invalid);    return 0;}
Craykonmain.cray · 40 行
first = コンソール.数読み();k = first[1];answers = コンソール.数読み(); counts = 新リスト(k, 0); // 0번 칸이 1점invalid = 0;それぞれ (r の中 answers){    もし (r >= 1 && r <= k)    {        counts[r - 1] = counts[r - 1] + 1;    }    でなければ    {        invalid++;    }} top = 0;それぞれ (c の中 counts){    top = 数学.大きい方(top, c);} 繰り返す (level = top; level >= 1; level--){    row = "";    それぞれ (c の中 counts)    {        row = row + (c >= level ? "#" : ".");    }    コンソール.書く(row);}labels = "";繰り返す (j = 1; j <= k; j++){    labels = labels + j;}コンソール.書く(labels);コンソール.書く(invalid);