{ }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()·표준 입력으로 들어가요(실행 중에 묻지 않아요).

$ 준비됐어요

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

다른 언어로는?언어별 풀이 보기 · 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};(초기값이 없으면 지역 배열은 쓰레기 값으로 시작해요), 크레이콘 새목록(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(...), 크레이콘 수학.큰수로 하나씩 비교해요.

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);