r 行 c 列の格子があり、はじめはすべてのマスが 0 である。 一行目に r、c、はんこの数 k が与えられ、続く k 行に "y x" が一つずつ与えられる。 はんこごとに y 行目 x 列目(どちらも 1 から数える)のマスの数を 1 増やせ。 すべて押したあと、格子を r 行で出力せよ。 各行は c 個の数を空白一つ区切りで書く。
入力
1 ≤ r ≤ 100、1 ≤ c ≤ 100、0 ≤ k ≤ 10,000、1 ≤ y ≤ r、1 ≤ x ≤ c
出力
r 行、各行 c 個の数
例 1 · stdin
2 3 3
1 1
2 3
1 1
stdout
2 0 0
0 0 1
main.py
エラー一覧00F8 ↓ · ⇧F8 ↑
入力(stdin)
実行すると、これらの行が順に input()・標準入力に渡されます(実行中に入力を求めません)。
$ 準備完了
コードを入力して解くにはパソコンで開いてください。モバイルでは問題と解答を見られます。
ほかの言語では?言語別の解答を見る · 8 言語の解答
0 で埋めた 2 次元リストの作り方は言語ごとに違います。 Java new int[r][c]、C# new int[r, c] はマスが最初から 0 です。 C は関数内の配列が 0 から始まる保証がないので int grid[100][100] = {0}; と書きます。 忘れると不定の値が入っていて、たまたま 0 で合っているように見えることもあります(グローバル・static 配列は 0 から始まる)。 C++ std::vector<std::vector<int>> grid(r, std::vector<int>(c, 0)) は内側の vector を行ごとに別々にコピーします。 落とし穴は Python と JavaScript です。 Python [[0] * c] * r は同じ行一つを r 回入れるので、一マス押すとその列のすべての行が一緒に変わります。 [[0] * c for _ in range(r)] で行ごとに新しく作ります。 JavaScript・TypeScript new Array(r).fill(new Array(c).fill(0)) も同じ配列一つで全行を埋めるので、Array.from({ length: r }, () => new Array(c).fill(0)) と書きます。 Craykon 新リスト(r, 新リスト(c, 0)) はリストを渡すとマスごとに別々にコピーするので、行どうしがつながりません。
Pythonmain.py · 7 行
r, c, k = map(int, input().split())grid = [[0] * c for _ in range(r)] # 줄마다 새 목록for _ in range(k): y, x = map(int, input().split()) grid[y - 1][x - 1] += 1for row in grid: print(*row)
JavaScriptmain.js · 5 行
const nums = require("fs").readFileSync(0, "utf8").trim().split(/\s+/).map(Number);const [r, c, k] = nums;const grid = Array.from({ length: r }, () => new Array(c).fill(0)); // 줄마다 새 배열for (let i = 0; i < k; i++) grid[nums[3 + 2 * i] - 1][nums[4 + 2 * i] - 1]++;console.log(grid.map((row) => row.join(" ")).join("\n"));
TypeScriptmain.ts · 6 行
import { readFileSync } from "node:fs";const nums: number[] = readFileSync(0, "utf8").trim().split(/\s+/).map(Number);const [r, c, k] = nums;const grid: number[][] = Array.from({ length: r }, () => new Array<number>(c).fill(0)); // 줄마다 새 배열for (let i = 0; i < k; i++) grid[nums[3 + 2 * i] - 1][nums[4 + 2 * i] - 1]++;console.log(grid.map((row) => row.join(" ")).join("\n"));
JavaMain.java · 27 行
import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.util.StringTokenizer;public class Main { public static void main(String[] args) throws IOException { BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new StringTokenizer(in.readLine()); int r = Integer.parseInt(st.nextToken()); int c = Integer.parseInt(st.nextToken()); int k = Integer.parseInt(st.nextToken()); int[][] grid = new int[r][c]; // 칸은 처음부터 0 for (int i = 0; i < k; i++) { st = new StringTokenizer(in.readLine()); int y = Integer.parseInt(st.nextToken()); int x = Integer.parseInt(st.nextToken()); grid[y - 1][x - 1]++; } StringBuilder out = new StringBuilder(); for (int[] row : grid) { for (int j = 0; j < c; j++) out.append(j > 0 ? " " : "").append(row[j]); out.append('\n'); } System.out.print(out); }}
C#Main.cs · 25 行
using System;using System.Linq;using System.Text;class Program{ static void Main() { int[] rck = Console.ReadLine().Split(' ', StringSplitOptions.RemoveEmptyEntries).Select(int.Parse).ToArray(); int r = rck[0], c = rck[1], k = rck[2]; int[,] grid = new int[r, c]; // 칸은 처음부터 0 for (int i = 0; i < k; i++) { int[] yx = Console.ReadLine().Split(' ', StringSplitOptions.RemoveEmptyEntries).Select(int.Parse).ToArray(); grid[yx[0] - 1, yx[1] - 1]++; } var out_ = new StringBuilder(); for (int y = 0; y < r; y++) { for (int x = 0; x < c; x++) out_.Append(x > 0 ? " " : "").Append(grid[y, x]); out_.Append('\n'); } Console.Write(out_); }}
C++main.cpp · 17 行
#include <iostream>#include <vector>int main() { std::ios::sync_with_stdio(false); int r, c, k, y, x; std::cin >> r >> c >> k; std::vector<std::vector<int>> grid(r, std::vector<int>(c, 0)); // 줄마다 따로 복사된다 for (int i = 0; i < k; i++) { std::cin >> y >> x; grid[y - 1][x - 1]++; } for (const auto& row : grid) { for (int j = 0; j < c; j++) std::cout << (j ? " " : "") << row[j]; std::cout << "\n"; }}
Cmain.c · 16 行
#include <stdio.h>int main(void) { int r, c, k, y, x; int grid[100][100] = {0}; /* 함수 안 배열은 = {0} 이 있어야 0으로 시작한다 */ scanf("%d %d %d", &r, &c, &k); for (int i = 0; i < k; i++) { scanf("%d %d", &y, &x); grid[y - 1][x - 1]++; } for (int i = 0; i < r; i++) { for (int j = 0; j < c; j++) printf(j ? " %d" : "%d", grid[i][j]); putchar('\n'); } return 0;}