第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 を知ったわけですが、使ってみて、確かに使いやすい! と思いました。キーをオブジェクトにしちゃうことも出来るそうで、使い方によっては、なんだか夢が膨らみます。
こういう新しいことを覚える、というのは楽しくて良いです。今後、もっと活用して、使い方の幅を広げていきたいと思います。
引き続き、よろしくお願いいたします!
ディスカッション
コメント一覧
まだ、コメントがありません