第101回【JavaScript】辞書の基本、辞書のデータ更新

現在取り組んでいるのは、paiza ラーニング問題集「Cランクレベルアップメニュー」になります。

はじめに

猫とキャンプと野球観戦と AWS が大好きな旦那、LeoSaki です。モフモフしたい。

JavaScript をゼロから勉強してみよう、のコーナー 101 回目です。

なぜ 101 匹にゃんちゃんではダメだったのか。猫をこよなく愛する LeoSaki(旦那)としては、やはり、101 匹いるのは猫であるべきだと思う。・・・まぁ、あまり内容を詳しく知っているわけではないんですけれど。

それでは、今日も頑張ってみようと思います。

辞書の基本 (paizaランク C 相当)

n 人の人に関して、それぞれの人の名前と財産が与えられます。その後に人名 S が与えられるので (S は最初に与えられた名前のうちのいずれか) 、 S の財産を表す整数を出力してください。


入力される値

n
s_1 a_1
...
s_n a_n
S

1 行目には正整数nが与えられ、 2 行目から (n + 1) 行目には、人々の名前と財産が “s_i a_i” というフォーマット (s_i は人の名前を表す文字列、 a_i はその人の財産を表す整数、半角スペース区切り)で与えられます。 (n + 2) 行目には人名 S が与えられます (S は 2 行目から (n + 1) 行目にかけて与えられた人名のいずれか)。

入力値最終行の末尾に改行が1つ入ります。


期待する出力

S の財産を出力してください。

また、末尾に改行を入れ、余計な文字、空行を含んではいけません。


すべてのテストケースにおいて、以下の条件をみたします。

・1 ≤ n , a_i ≤ 50 (1 ≤ i ≤ n)
・各 s_i (1 ≤ i ≤ n) および S は大小アルファベットからなる長さ 1 以上 10 以下の文字列


入力例

2
Kirishima 1
Kyoko 2
Kirishima

出力例

1

普通にコードを書いていて一番利用するのが連想配列な気がします。マスターすればこれほど便利で使いやすいものはない、と思う。

JavaScript
process.stdin.resume();
process.stdin.setEncoding('utf8');

var lines = [];
var reader = require('readline').createInterface({
  input: process.stdin,
  output: process.stdout
});
reader.on('line', (line) => {
  lines.push(line);
});
reader.on('close', () => {
  const n = Number(lines[0]);
  const assets = {};
  for (let i = 1; i <= n; i++) {
      const [s,a] = lines[i].split(/\s/);
      assets[s] = a;
  }
  const S = lines[n + 1];
  console.log(Number(assets[S]));
});

模範解答で初めて Map を知りました。お恥ずかしい。大変便利そうなので使ってみます。

JavaScript(Map)
process.stdin.resume();
process.stdin.setEncoding('utf8');

var lines = [];
var reader = require('readline').createInterface({
  input: process.stdin,
  output: process.stdout
});
reader.on('line', (line) => {
  lines.push(line);
});
reader.on('close', () => {
  const n = Number(lines[0]);
  const assets = new Map();
  for (let i = 1; i <= n; i++) {
      const [s,a] = lines[i].split(/\s/);
      assets.set(s,a);
  }
  const S = lines[n + 1];
  console.log(Number(assets.get(S)));
});
Python
N = int(input())
dic = {}
for _ in range(N):
    s,a = input().split()
    dic[s] = a
print(dic[input()])

辞書のデータ更新 (paizaランク C 相当)

n 人の人の名前 s_1, …, s_n が与えられたのち、 m 回の「攻撃」に関する情報が与えられます。各行は “p_i a_i” というフォーマットで与えられ、 p_i はダメージを受けた人の名前 (s_1, …, s_n のいずれか) 、 a_i は p_i が受けたダメージ数を表す数です。

最後に人名 S が与えられるので (S は s_1, …, s_n のいずれか) 、 S が受けたダメージの合計を出力してください。なお、一度もダメージを受けていない人の合計ダメージは 0 とします。


入力される値

n
s_1
...
s_n
m
p_1 a_1
...
p_m a_m
S

1 行目には正整数 n が与えられ、 2 行目から (n + 1) 行目には人の名前 s_1, …, s_n が改行区切りで与えられます。 (n + 2) 行目には正整数 m が与えられ、 (n + 3) 行目から (n + m + 2) 行目には人の名前 p_i (s_1, …, s_n のいずれか) とその人が受けたダメージ a_i が “p_i a_i" という半角スペース区切りのフォーマットで m 行与えられます。 (n + m + 3) 行目には s_1, …, s_n の中のいずれかの人名 S が与えられます。

入力値最終行の末尾に改行が1つ入ります。


期待する出力

S の受けた合計ダメージを出力してください。

また、末尾に改行を入れ、余計な文字、空行を含んではいけません。


すべてのテストケースにおいて、以下の条件をみたします。

・1 ≤ n, a_i ≤ 50 (1 ≤ i ≤ n)
・各 s_i (1 ≤ i ≤ n) は大小アルファベットからなる長さ 1 以上 10 以下の文字列で、互いに全て異なる


入力例

2
Kirishima
Kyoko
2
Kyoko 1
Kyoko 2
Kyoko

出力例

3

ちょっとゲームみたいで好きです。こういう問題。

JavaScript
process.stdin.resume();
process.stdin.setEncoding('utf8');

var lines = [];
var reader = require('readline').createInterface({
  input: process.stdin,
  output: process.stdout
});
reader.on('line', (line) => {
  lines.push(line);
});
reader.on('close', () => {
  const n = Number(lines[0]);
  const players = {};
  for (let i = 1; i <= n; i++) {
      players[lines[i]] = 0;
  }
  const m = Number(lines[n + 1]);
  for (let i = n + 2; i <= n + m + 1; i++) {
      const [p,a] = lines[i].split(/\s/);
      players[p] = players[p] + Number(a);
  }
  const S = lines[n + m + 2];
  console.log(players[S]);
});

せっかく覚えたので、Map を利用して書いてみる。

JavaScript(Map)
process.stdin.resume();
process.stdin.setEncoding('utf8');

var lines = [];
var reader = require('readline').createInterface({
  input: process.stdin,
  output: process.stdout
});
reader.on('line', (line) => {
  lines.push(line);
});
reader.on('close', () => {
  const n = Number(lines[0]);
  const players = new Map();
  for (let i = 1; i <= n; i++) {
      players.set(lines[i],0);
  }
  const m = Number(lines[n + 1]);
  for (let i = n + 2; i <= n + m + 1; i++) {
      const [p,a] = lines[i].split(/\s/);
      players.set(p,players.get(p) + Number(a));
  }
  const S = lines[n + m + 2];
  console.log(players.get(S));
});
Python
N = int(input())
dic = { input():0 for _ in range(N) }
M = int(input())
for _ in range(M):
    p,a = input().split()
    dic[p] += int(a)
print(dic[input()])

最後に

今回、Map を知ったわけですが、使ってみて、確かに使いやすい! と思いました。キーをオブジェクトにしちゃうことも出来るそうで、使い方によっては、なんだか夢が膨らみます。

こういう新しいことを覚える、というのは楽しくて良いです。今後、もっと活用して、使い方の幅を広げていきたいと思います。

引き続き、よろしくお願いいたします!

Python の第101回はこちら