{ }codelper
목록 채워 만들기2차원 목록P0061

격자에 도장 찍기

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
입력(stdin)

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

$ 준비됐어요

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

다른 언어로는?언어별 풀이 보기 · 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))로 써요.
크레이콘 새목록(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;}
Craykonmain.cray · 15 줄
rck = 콘솔.수들읽기();r = rck[0];c = rck[1];k = rck[2];// 새목록에 목록을 주면 칸마다 따로 복사해 넣는다grid = 새목록(r, 새목록(c, 0));반복 (i = 0; i < k; i++){    yx = 콘솔.수들읽기();    grid[yx[0] - 1][yx[1] - 1] += 1;}각각 (row 에서 grid){    콘솔.쓰기(row);}