第85回【JavaScript】英小文字の出現率、文字列の出現率

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

はじめに

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

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

AWS で新しいことをしてみよう、と思ったとき、すぐに実行に移ることが出来るのがいいところだと思います。しかし、お金がかかることになると、やりたいことを説明して稟議を作成して、となかなかスタートラインに立つことが出来ません。

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

英小文字の出現率 (paizaランク C 相当)

長さ N の文字列 S が与えられます。S に含まれている各文字の出現回数をそれぞれ求め、「a」の出現回数、「b」の出現回数、…、「z」の出現回数をこの順に半角スペース区切りで1行に出力してください。


入力される値

N
S

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


期待する出力

「a」の出現回数 count_a、「b」の出現回数 count_b、…、「z」の出現回数 count_z をこの順に半角スペース区切りで1行に出力してください。

count_a count_b ... count_z

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


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

・ 1 ≦ N ≦ 100
・ S は英小文字「a」,「b」, … ,「z」からなる長さ N の文字列


入力例

13
aaabbbccdddde

出力例

3 3 2 4 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

こうなると、連想配列を利用するのが早そうだ。

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 s = lines[1];
  const dic = {};
  for (let i = 'a'.charCodeAt(0); i <= 'z'.charCodeAt(0); i++) {
      dic[String.fromCharCode(i)] = 0;
  }
  for (let val of s) {
      dic[val]++;
  }
  console.log(Object.values(dic).join(' '));
});
Python
N = int(input())
S = input()
dic = { chr(x):0 for x in range(ord('a'),ord('z')+1) }
for s in S:
    dic[s] += 1
print(' '.join(map(str,dic.values())))

文字列の出現率 (paizaランク C 相当)

文字列が N 個与えられます。各文字列の出現回数を文字列の辞書順に出力してください。


入力される値

N
S_1
S_2
...
S_N

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


期待する出力

文字列 S とその出現回数 A を、文字列 S の辞書順に、改行区切りで出力してください。

S A
...

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


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

・ 1 ≦ N ≦ 100
・ S_i は英小文字「a」,「b」, … ,「z」からなる1文字以上3文字以下の文字列 (1 ≦ i ≦ N)


入力例

5
bcd
abc
bcd
bcd
bcd

出力例

abc 1
bcd 4

存在確認して、並べ替えして、なかなか手間がかかりそう。

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 dic = {};
  for (let i = 1; i <= n; i++) {
      const key = lines[i];
      if (key in dic) {
          dic[key]++;
      } else {
          dic[key] = 1;
      }
  }
  const keys = Object.keys(dic);
  keys.sort();
  for (let val of keys) {
      console.log(val,dic[val]);
  }
});
Python
N = int(input())
dic = {}
for _ in range(N):
    S = input()
    if S in dic:
        dic[S] += 1
    else:
        dic[S] = 1
for k,v in sorted(dic.items()):
    print(k,v)

最後に

キーで並べ替えを実行する方法がよくわからず。キーだけの配列を作り、並べ替えをして、その配列から順番にキーを取り出して・・・、これでいいんだろうか。

連想配列は絶対に多用することになるものだと思うので、いろいろな使い方のパターンを覚えるしかないかなぁと思っています。頑張って学習続けます。

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

Python の第85回はこちら