1
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?

がんばらない競プロ千里行 〜AtCoder入緑を目指して〜【〜14日目:ちゃんと続けていたよ】

Last updated at Posted at 2024-11-24

コイツ、もう挫折したのかと思われた方。実はちゃんとやっていました。
👇 前の記事

14日目までにやったこと

とりあえず毎日

  1. AOJのAtCoder Beginners Selection
  2. AtCoderのIntroduction To Programming I

はコツコツやっていました。それ以外やっていません。

コンテストは「AtCoder Beginner Contest 381」だけ参加しました。

改めて「がんばらない」ルール

  • 使う教材は以下の記事とその記事内で紹介されている記事のみ

  • 1日3問以上練習問題を解かない
  • 1時間以上競プロに時間を割かない(コンテストは除く)
  • JavaScriptのみを使う
  • 他人と比較しない

目標

中期目標:2025/1/15 までにAtCoderで入茶する
最終目標:2025/3/31までにAtCoderで入緑する

このルールで2週間やった結果

結論:A,B問題くらいなら時間をかけたら正解できそう。

「AtCoder Beginner Contest 381」に参加した結果です。

atcoder.jp_users_tenkawa_k.png

40分くらいかけて2完でしたところで完全に集中力が切れて、C,D問題にそれぞれ1回アタックしてTLEが出たところで飽きたので終わりました。集中力が一番の敵まであります。
A, B問題は毎日練習問題やっていたから正解した気がします。C,D問題は「あ、これなんかコツいりそうだけど多分知らねぇわ」って思いながらやって案の定TLEが出ました。
レート15って。

次のコンテストまでにやること

  • アルゴリズムの引き出しが壊滅的に無いので、一個くらい引き出しを作ろうと思います
    • 全文探索?みたいなやつに手を出しみようかな
  • AtCoderの Introduction To Programming I は全部解き終えたので適当な過去コンテストを毎日1問だけ解くようにします
  • AOJのAtCoder Beginners Selection は引き続き行います

ここまでが第1章で、第2章はこの2週間で「あ、これ結構使いそう」と思ったJavaScriptのコードテクをメモしたいと思います。

14日間やってみて競プロでよく使いそうだと思ったJavaScriptのコード

標準入力の処理

これ書けないと間違いなく死ぬ。

標準入力
const a = require("fs").readFileSync("/dev/stdin", "utf8")

ここから派生して色々やります。

標準入力派生
// 標準入力で受け付けた文字を分割して数値にする
const [a,b] 
= require("fs").readFileSync("/dev/stdin", "utf8").trim().split(" ").map(Number);

// 1行目が要素数で2行目以降に処理する対象系の問題
const [N, ...An] 
= require("fs").readFileSync("/dev/stdin", "utf8").trim().split("\n");
for (const Ai of An.slice(0,N)) {
    // ...
}

数値操作

ソート

JSのソートの仕様、結構ややこしいけど「return値が1以上なら右(👉👉👉👉)に追いやる」で覚える。

const nums = [10, 4, 9];
const sorted = nums.sort((a,b) => a - b); // [4, 9, 10]

配列内の数値の合計

reduceを使う
const num = [1,2,3];
const sum = num.reduce((a,b)=> a + b)); // 6

最大値を取り出す

スプレッド演算子で展開するのがポイント
const nums = [1, 10, 5];
console.log(Math.max(...nums)); // 10

各桁の合計

一旦数字を文字に変換して一文字ずつ分割後、各項を合計する。最初に思いついた人すげーと思った。

一旦文字列にする
const num = 1235;
const sum = [...num.toString()].map(Number).reduce((a,b) => a + b); // 11

割り算の整数値を取り出す

Math.floor(a/b); // 2.34566 の 2が取得できる

小数点の桁数を指定

罠だけど「文字列」が返ってくる。

toFixedを使う
(a/b).toFixed(6); // <- 指定したい桁数を引数に入れる

文字列操作

反転

これから使いそう。

const str = "abcdef";
const revstr = str.split("").reverse().join(""); // fedcba

配列操作

指定回数繰り返す

[...Array(5)].map((v,i) => console.log('i'))

回数が超大きい数字だとメモリエラー起こしそうなので、その場合はジェネレータを使う。100万以上の要素を取り扱いそうなら選択肢に入れる。

function* gen(n) {
    for (let i = 0; i < n; i++) {
        yield i;
    }
}

for (const g of gen(1000000)) {
    console.log(g);
}

👇 参考

中身が全部同じか判定

文字列に変換する。文字列変換は超便利っぽい。

array1.toString() === array2.toString()

要素の種類の数を取得

new Set() を使う。

Setはチート
const array = [1,1,2,2,3,3];
const s = new Set(array);
console.log(s.size); // 3
1
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
1
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?