{ }codelper
辞書の走査キー順P0065

番号順の名簿

一行目に記録の数 n が与えられ、続く n 行に "番号 名前" が空白一つで区切られて与えられる。
同じ番号が何度も出たら、最後に出た名前だけが残る。
異なる番号ごとに "番号 名前" を一行ずつ、番号の小さいものから(数の大きさの順、負の数が先)出力せよ。

入力
1 ≤ n ≤ 2000、-1,000,000,000 ≤ 番号 ≤ 1,000,000,000(整数)。
名前は英小文字 1〜12 文字
出力
異なる番号の数だけの行、各行に番号と名前を空白一つで
例 1 · stdin
5
30 mina
-2 jun
100 seo
30 hana
7 ari
stdout
-2 jun
7 ari
30 hana
100 seo
main.py
入力(stdin)

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

$ 準備完了

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

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

辞書を回るときに出てくる順番は言語ごとに違います。
Python dict、JS Map、C# Dictionary(ドキュメントでは保証しない)は入れた順、Java HashMap と C++ unordered_map は決まった順がありません。
キー順に並んだまま保たれるのは C++ std::map、Java TreeMap、C# SortedDictionary です。
Python は sorted(roster) でキーを並べて回ります。
JS には落とし穴が二つあります:比較関数なしの keys.sort() は数も文字列として比べるので 10 が 9 より前に来ます((a, b) => a - b を渡しましょう)。
空のオブジェクト {} は 0 以上の整数キーだけを小さい順に前に置き、"-3" のようなキーは入れた順に後ろに置きます。
番号を文字列のままキーにすると、どの言語でも文字列の順になります。
C には辞書がないので構造体の配列を(番号, 入った順)で qsort し、同じ番号の最後のものだけを使います。
Craykon の 辞書() は Python のように入れた順を保つので、keys = roster.キー一覧; keys.並べ替え(); で並べます(数は大きさ順)。

Pythonmain.py · 10 行
import sys lines = sys.stdin.read().split("\n")n = int(lines[0])roster = {}for line in lines[1:n + 1]:    key, name = line.split()    roster[int(key)] = namefor key in sorted(roster):    print(key, roster[key])
JavaScriptmain.js · 9 行
const lines = require("fs").readFileSync(0, "utf8").split("\n");const n = Number(lines[0]);const roster = new Map();for (let i = 1; i <= n; i++) {  const [key, name] = lines[i].trim().split(" ");  roster.set(Number(key), name);}const keys = [...roster.keys()].sort((a, b) => a - b);console.log(keys.map((k) => `${k} ${roster.get(k)}`).join("\n"));
TypeScriptmain.ts · 10 行
import { readFileSync } from "node:fs";const lines: string[] = readFileSync(0, "utf8").split("\n");const n: number = Number(lines[0]);const roster = new Map<number, string>();for (let i = 1; i <= n; i++) {  const [key, name] = lines[i].trim().split(" ");  roster.set(Number(key), name);}const keys: number[] = [...roster.keys()].sort((a, b) => a - b);console.log(keys.map((k) => `${k} ${roster.get(k)}`).join("\n"));
JavaMain.java · 21 行
import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.util.Map;import java.util.TreeMap; public class Main {    public static void main(String[] args) throws IOException {        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));        int n = Integer.parseInt(in.readLine().trim());        Map<Integer, String> roster = new TreeMap<>();        for (int i = 0; i < n; i++) {            String[] p = in.readLine().trim().split(" ");            roster.put(Integer.parseInt(p[0]), p[1]);        }        StringBuilder out = new StringBuilder();        for (Map.Entry<Integer, String> e : roster.entrySet())            out.append(e.getKey()).append(' ').append(e.getValue()).append('\n');        System.out.print(out);    }}
C#Main.cs · 17 行
using System;using System.Collections.Generic; class Program{    static void Main()    {        int n = int.Parse(Console.ReadLine());        var roster = new SortedDictionary<int, string>();        for (int i = 0; i < n; i++)        {            string[] p = Console.ReadLine().Trim().Split(' ');            roster[int.Parse(p[0])] = p[1];        }        foreach (var kv in roster) Console.WriteLine($"{kv.Key} {kv.Value}");    }}
C++main.cpp · 16 行
#include <iostream>#include <map>#include <string> int main() {    int n;    std::cin >> n;    std::map<int, std::string> roster; // std::map은 열쇠 순으로 정렬된 채 있다    for (int i = 0; i < n; i++) {        int key;        std::string name;        std::cin >> key >> name;        roster[key] = name;    }    for (const auto& [key, name] : roster) std::cout << key << ' ' << name << '\n';}
Cmain.c · 29 行
#include <stdio.h>#include <stdlib.h> struct Entry {    int key;    int order; /* 몇째로 들어왔나: 같은 번호면 나중 것이 이긴다 */    char name[13];}; static int by_key_then_order(const void *pa, const void *pb) {    const struct Entry *a = pa, *b = pb;    if (a->key != b->key) return a->key < b->key ? -1 : 1;    return a->order - b->order;} int main(void) {    static struct Entry e[2000];    int n;    scanf("%d", &n);    for (int i = 0; i < n; i++) {        scanf("%d %12s", &e[i].key, e[i].name);        e[i].order = i;    }    /* C에는 사전이 없다: 번호 순으로 정렬하고, 같은 번호 묶음의 마지막 것만 쓴다 */    qsort(e, n, sizeof e[0], by_key_then_order);    for (int i = 0; i < n; i++)        if (i == n - 1 || e[i + 1].key != e[i].key) printf("%d %s\n", e[i].key, e[i].name);    return 0;}
Craykonmain.cray · 13 行
n = コンソール.行読み().数に();roster = 辞書();繰り返す (i = 0; i < n; i++){    p = コンソール.行読み().空白除去().分ける();    roster[p[0].数に()] = p[1];}keys = roster.キー一覧;keys.並べ替え();それぞれ (k の中 keys){    コンソール.書く(k + " " + roster[k]);}