第86回【JavaScript】価格の算出、商品の検索

現在取り組んでいるのは、paiza ラーニング問題集「データセット選択メニュー」になります。

はじめに

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

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

AWS が大好きな LeoSaki(旦那)としては、AWS のマネージドのサービスを活用したマイクロサービス化を推進したいところですが、いろいろなサービスを勉強しなければならなくなり、他のメンバーが二の足を踏んでしまう状態です。

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

価格の算出 (paizaランク C 相当)

paiza 商店では N 個の商品が売られており、i 番目の商品の名前は A_i で、価格は B_i です。
あなたは M 個の商品名が書かれたお買い物リスト S を持っています。リストに書かれているそれぞれの商品について、paiza 商店での価格を出力してください。リストには paiza 商店が扱っていない商品も書かれている可能性がありますが、その場合は価格の代わりに -1 を出力してください。


入力される値

N M
A_1 B_1
A_2 B_2
...
A_N B_N
S_1
S_2
...
S_M

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


期待する出力

M 行出力してください。i 行目には、商品 S_i の価格 T_i を出力してください。paiza 商店に商品 S_i が売られていない場合は価格の代わりに -1 を出力してください。

T_1
T_2
...
T_M

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


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

・ 1 ≦ N ≦ 100
・ 1 ≦ M ≦ 100
・ A_i は英子文字からなる1文字以上10文字以下の文字列 (1 ≦ i ≦ N)
・ i ≠ j ならば A_i ≠ A_j
・ 1 ≦ B_i ≦ 100 (1 ≦ i ≦ N)
・ S_i は英子文字からなる1文字以上10文字以下の文字列 (1 ≦ i ≦ N)
・ i ≠ j ならば S_i ≠ S_j


入力例

3 4
eraser 50
pencil 30
book 100
book
eraser
pencil
margaret

出力例

100
50
30
-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,m] = lines[0].split(/\s/).map(Number);
  const merchandice = {};
  for (let i = 1; i <= n; i++) {
      const [A,B] = lines[i].split(/\s/);
      merchandice[A] = B;
  }
  for (let i = n + 1; i < n + 1 + m; i++) {
      const S = lines[i];
      if (S in merchandice) {
          console.log(merchandice[S]);
      } else {
          console.log(-1);
      }
  }
});
Python
N,M = map(int,input().split())
A = {}
for _ in range(N):
    a,b = input().split()
    A[a] = b
for _ in range(M):
    s = input()
    if s in A:
        print(A[s])
    else:
        print(-1)

商品の検索 (paizaランク C 相当)

N 個の文字列 S_1, … , S_N と、Q 個の文字列 T_1, … , T_Q が与えられます。各 T_i について、以下の処理を行ってください。

・ S_j == T_i を満たす最小の j を出力する。ただし、そのような j が存在しない場合は -1 を出力する。


入力される値

N Q
S_1
S_2
...
S_N
T_1
T_2
...
T_Q

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


期待する出力

Q 行出力してください。i 行目には、S_j == T_i を満たす最小の j を出力してください。ただし、そのような j が存在しない場合は -1 を出力してください。

j_1
...
j_Q

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


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

・ 1 ≦ N ≦ 100
・ 1 ≦ Q ≦ 100
・ S_i, T_j は英小文字からなる1文字以上3文字以下の文字列 (1 ≦ i ≦ N,1 ≦ j ≦ Q)


入力例

3 2
a
b
c
b
d

出力例

2
-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,Q] = lines[0].split(/\s/).map(Number);
  const S = {};
  for (let i = 1; i <= N; i++) {
      const s = lines[i];
      if (!(s in S)) {
          S[s] = i;
      }
  }
  for (let i = N + 1; i < N + 1 + Q; i++) {
      const T = lines[i];
      if (T in S) {
          console.log(S[T]);
      } else {
          console.log(-1);
      }
  }
});
Python
N,Q = map(int,input().split())
S = {}
for i in range(1,N+1):
    s = input()
    if not s in S:
        S[s] = i
for i in range(Q):
    t = input()
    if t in S:
        print(S[t])
    else:
        print(-1)

最後に

連想配列は普段からかなり多用しているため、問題なく出来ています。扱いは、他の言語でもあまり変わらないですね。わかりやすいです。

for 文の中がちょっとごちゃごちゃしていて見にくいなぁと思います。しかし、下手に簡潔に書くよりは、面倒でも + 1 をしっかり書いておくとかした方が、後で分かりやすいと感じています。もっと綺麗な書き方があれば教えていただけますと幸いです。

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

Python の第86回はこちら