第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")
最後に
多重ループはかなり多用しますが、あまり深くなりすぎると分かりづらくなる、という点も注意が必要かと思います。深くなるようだったら、そもそものロジックを考え直せ、と言われたことがあります。
インデックスの取得であったり、含まれているかどうかであったり、こちらも方法はたくさんあるので、いろんな方法を頭に入れておいて、適切に使う必要があると感じました。
引き続き、よろしくお願いいたします!
ディスカッション
コメント一覧
まだ、コメントがありません