満足度アンケートで 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
エラー一覧00F8 ↓ · ⇧F8 ↑
入力(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 += 1top = 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;}