0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

paizaラーニング レベルアップ問題集 線形探索メニュー応用編 JavaScript CSV ファイル 2まとめ

Last updated at Posted at 2022-11-02

CSV ファイル 2

STEPを順番に解いていけばFINAL問題が解けます

STEP: 1 文字の探索

文字列の中から特定の文字を探索します

解答例

indexOfで一発です。

const fs = require("fs");
const input = fs.readFileSync("/dev/stdin", "utf-8").trim();
const lines = input.split("\n");
const [s, c] = lines.slice(0);
console.log(s.indexOf(c) + 1);

STEP: 2 文字のカウント

文字列に含まれる文字の頻度分析をおこないます

解答例

sをfilterにかけ、lengthで文字数がわかります。アルファベットを順に調べていきます。

const fs = require("fs");
const input = fs.readFileSync("/dev/stdin", "utf-8").trim();
const lines = input.split("\n");

const s = lines[0].split("");
const alphabet = "abcdefghijklmnopqrstuvwxyz";

for (let i = 0; i < alphabet.length; i++) {
  console.log(s.filter(v => v === alphabet[i]).length);
}

STEP: 3 部分文字列

文字列から特定の部分文字列の個数を計算します

l,rを全探索してもよいですが、lだけ全探索した方が少し効率がよくなります。

ループを用いて l を全探索します。文字列 s の長さを n, 文字列 t の長さを m とおくと、 l は 0 以上 n - m + 1 未満をとります。

次に、 s の l 番目から連続する m 文字の文字列を作成します。この文字列が t と等しければ、答えを 1 増やします。

s の l 番目から連続する m 文字の文字列を作成する方法は2つあります。

  1. for文
    変数を置いて、forループで変数に追加して作成します。
  2. メソッド
    多くの言語では部分文字列を作成する機能が搭載されています。これを用いると簡潔に記述できます。JavaScriptには、substrsubstringsliceなどがありますが、substrは非推奨なので、使わない方がよいかもしれません。

解答例1(for文)

for文で文字列作成です。

const fs = require("fs");
const input = fs.readFileSync("/dev/stdin", "utf-8").trim();
const lines = input.split("\n");
//sの部分列がt
const [s, t] = lines.slice(0);

let ans = 0;//sの部分列でtと等しいものの個数
//sの先頭から調べる
for (let i = 0; i < s.length - t.length + 1; i++) {
  //for文で文字列作成
  let substr =  "";
  for (let j = 0; j < t.length; j++) {
    substr += s[i + j];
  }
  //作成文字列がtと等しいならカウント
  if (substr === t) {
    ans += 1;
  }
}
console.log(ans);

解答例2(メソッド)

メソッドで文字列作成です。sliceで解答していますが、substringでもできます。

const fs = require("fs");
const input = fs.readFileSync("/dev/stdin", "utf-8").trim();
const lines = input.split("\n");
//sの部分列がt
const [s, t] = lines.slice(0);

let ans = 0;//sの部分列でtと等しいものの個数
//sの先頭から調べる
for (let i = 0; i < s.length - t.length + 1; i++) {
  //メソッドで文字列作成
  if (s.slice(i, i + t.length) === t) { //sliceはsubstringでも可
    ans += 1;
  }
}
console.log(ans);

解答例3(異なる文字が含まれていたらカウントしない)

文字列を作成せず、異なる文字が含まれていたら、カウントしない、全て同じならカウントする、というやり方です。

const fs = require("fs");
const input = fs.readFileSync("/dev/stdin", "utf-8").trim();
const lines = input.split("\n");
//sの部分列がt
const [s, t] = lines.slice(0);

let ans = 0;//sの部分列でtと等しいものの個数
//sの先頭から調べる
for (let l = 0; l < s.length; l++) {
  let flag =  true;//sの部分列とtが等しいか
  for (let i = 0; i < t.length; i++) {
    if (s[l + i] !== t[i]) { //s!=tならfalse
      flag = false;
      break;
    }
  }
  if (flag) ans++;//s=tならtrueでans++
}
console.log(ans);

STEP: 4 分割

文字列を特定の条件で分割します

解答例

splitで分割してjoinで半角スペース区切りにします。

const fs = require("fs");
const input = fs.readFileSync("/dev/stdin", "utf-8").trim();
const lines = input.split("\n");
console.log(lines[0].split(",").join(" "));

STEP: 5 CSV ファイル 1

CSV 形式の文字を解析します

解答例

split(",")でカンマで区切って配列にして、2列目がx以上か調べます。

const fs = require("fs");
const input = fs.readFileSync("/dev/stdin", "utf-8").trim();
const lines = input.split("\n");

const [n, x] = lines[0].split(" ").map(Number);

for (let i = 1; i <= n; i++) {
  const s = lines[i].split(",").map(Number);
  if (s[1] >= x) {
    console.log(lines[i]);
  }
}

解答例(ワンライナー)

1文で解いてみました。

const fs = require("fs");
const input = fs.readFileSync("/dev/stdin", "utf-8").trim();
const lines = input.split("\n");

console.log(
  lines.slice(1) //1行目以降を配列に
    .filter(line => //x以上を残す 
      line.split(",").map(Number)[1] >=  //sの2列目の値
      lines[0].split(" ").map(Number)[1] //x
    )
    .join("\n")//改行区切り
);

FINAL問題 CSV ファイル 2

CSV 形式の文字を解析します

STEP: 5 CSV ファイル 1の2列目をk列目にすればいいです。

const fs = require("fs");
const input = fs.readFileSync("/dev/stdin", "utf-8").trim();
const lines = input.split("\n");

const [n, m, k, x] = lines[0].split(" ").map(Number);

for (let i = 1; i <= n; i++) {
  const s = lines[i].split(",").map(Number);
  if (s[k - 1] >= x) {
    console.log(lines[i]);
  }
}

解答例(ワンライナー)

const [n, m, k, x]を省けば、文は減りますが、文字数が多くなりそうなので、そのままです。

const fs = require("fs");
const input = fs.readFileSync("/dev/stdin", "utf-8").trim();
const lines = input.split("\n");

const [n, m, k, x] = lines[0].split(" ").map(Number);

console.log(
  lines.slice(1) //1行目以降を配列に
    .filter(line => //x以上を残す 
      line.split(",").map(Number)[k - 1] >= x//sのk列目の値>=x
    )
    .join("\n")//改行区切り
);
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?