第97回【JavaScript】インデックス取得、多重ループ

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

はじめに

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

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

面接の際に、何か質問はありますか、と聞くことがあります。大抵、前もって準備してきたであろう質問をされることが多いです。また、特にありません、と言われることもあります。つい最近、いやーないっすねー、と言われました。20 代後半の方でした。丁重にお断りしました。

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

インデックス取得 (paizaランク D 相当)

1 から n まで番号が付けられた人々がいます。 i 番目の人の財産は a_i 円です。金額 k が与えられるので(k は a_1, …, a_n のいずれか)、財産が k 円である人の番号を出力してください。ただし、そのような人が複数いる場合には、そうした人々の中で最も小さい番号を出力してください。


入力される値

n
a_1
...
a_n
k

1 行目には正整数 n 、 2 行目から (n + 1) 行目には n 個の整数 a_1, …, a_n が改行区切りで与えられ、 (n + 2) 行目には整数 k が与えられます。

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


期待する出力

財産が k 円である人の番号を出力してください。ただし、そのような人が複数いる場合には、そうした人々の中で最も小さい番号を出力してください。

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


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

・n および各 a_i (1 ≤ i ≤ n) は 1 以上 50 以下の整数
・k は a_1, …, a_n のいずれか

また、財産が k 円である人は、必ず1人以上いるとします。


入力例

2
5
6
6

出力例

2

ループで検索も出来るだろうし、便利なメソッドを利用する方法もあるだろうし。

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 a = [];
  for (let i = 1; i <= n; i++) {
      a.push(lines[i]);
  }
  const k = lines[n + 1];
  console.log(a.indexOf(k) + 1);
});
Python
N = int(input())
A = [int(input()) for _ in range(N)]
K = int(input())
print(A.index(K) + 1)

多重ループ (paizaランク D 相当)

m 個の文字 c_1, …, c_m と、 n 個の文字列 S_1, …, S_n が与えられます。各 c_i (1 ≤ i ≤ m) について、各 S_j (1 ≤ j ≤ n) に c_i が出現するかをそれぞれ調べ、出現する場合は “YES" を、そうでない場合には “NO" を、そのつど出力してください。


入力される値

m
c_1
...
c_m
n
S_1
...
S_n

1 行目に正整数 m が、 2 行目から (m + 1) 行目では文字 c_1, …,c_m が、 (m + 2) 行目に正整数 n が、 (m + 3) 行目から ( m + n + 2) 行目では文字列 S_1, …, S_n が、それぞれ改行区切りで与えられます(入力は全部で (m + n + 2) 行)。

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


期待する出力

c_1 が S_1 に出現するかどうか、 c_1 が S_2 に出現するかどうか、 … 、 c_1 が S_n に出現するかどうか、 c_2 が S_1 に出現するかどうか、 c_2 が S_2 に出現するかどうか、 … 、 c_2 が S_n に出現するかどうか、 … 、 c_m が S_1 に出現するかどうか、 c_m が S_2 に出現するかどうか、 … 、 c_m が S_n に出現するかどうか、という順番で m * n 回出力してください。

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


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

・1 ≤ m, n ≤ 50
・各 c_i, S_j (1 ≤ i ≤ m, 1 ≤ j ≤ n) はそれぞれアルファベット大文字あるいは小文字からなる文字、文字列
・各 S_j (1 ≤ j ≤ n) の長さは 1 以上 10 以下


入力例

1
a
2
paiza
kyoko

出力例

YES
NO

多重ループで解け、という問題ということでしょうか。

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 m = Number(lines[0]);
  const C = [];
  for (let i = 1; i <= m; i++) {
      C.push(lines[i]);
  }
  const n = Number(lines[m + 1]);
  const S = [];
  for (let i = m + 2; i <= m + n + 1; i++) {
      S.push(lines[i]);
  }
  for (let c of C) {
      for (let s of S) {
          if (s.includes(c)) {
              console.log('YES');
          } else {
              console.log('NO');
          }
      }
  }
});
Python
m = int(input())
C = [input() for _ in range(m)]
n = int(input())
S = [input() for _ in range(n)]
for c in C:
    for s in S:
        if c in s:
            print("YES")
        else:
            print("NO")

最後に

多重ループはかなり多用しますが、あまり深くなりすぎると分かりづらくなる、という点も注意が必要かと思います。深くなるようだったら、そもそものロジックを考え直せ、と言われたことがあります。

インデックスの取得であったり、含まれているかどうかであったり、こちらも方法はたくさんあるので、いろんな方法を頭に入れておいて、適切に使う必要があると感じました。

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

Python の第97回はこちら