JVM言語でもできる、競技プログラミング
by
dhirabayashi
Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
JVM言語でもできる、競技プログラミング JVM言語でもできる、競技プログラミング JJUG CCC 2024 Spring Daiki Hirabayashi
Slide 2
Slide 2 text
2 自己紹介 いわゆるシステムエンジニア – Javaをちょこちょこと – 最近はサーバサイドKotlin 平林 大輝 株式会社テクニケーション – 2021年~ 現職 X (Twitter): @dhirabayashi64 競プロ歴について – 2022年から本格的に開始 – 実力は普通
Slide 3
Slide 3 text
3 話すこと ● 競技プログラミング(競プロ)って何? – 概要 – 面白さや難しさ ● 使用するプログラミング言語の話 ● 面白さや実益についての実感
Slide 4
Slide 4 text
4 前置き ● 競プロといってもいろいろある ● 以下はAtCoderというサイトのABCというコンテスト前提
Slide 5
Slide 5 text
5 競技プログラミング(競プロ)とは? ● プログラミングを使って問題を解くゲームみたいなもの ● 参加者全員に同じ問題が与えられ、それを解くコードを書く ● 正解するコードを書いたら得点が得られる ● 多くの得点を獲得することを目指す – 得点が高い人ほど上位 – 得点が同じなら早く正解したほうが上位
Slide 6
Slide 6 text
6 競プロで取り組む「問題」 たとえば以下のような感じ 出典: https://atcoder.jp/contests/abc169/tasks/abc169_a
Slide 7
Slide 7 text
7 競プロで取り組む「問題」 ● 回答例
Slide 8
Slide 8 text
8 書いたコードは提出する
Slide 9
Slide 9 text
9 提出コードすると? ● 提出したコードに対して即座にテストが実行される – 入力に対し、出力が期待値通りかどうか – 実行時間、メモリ使用量が制限を超えていないか
Slide 10
Slide 10 text
10 提出結果 →AC(Accepted): 正解
Slide 11
Slide 11 text
11 もうちょっと難しい問題 出典: https://atcoder.jp/contests/abc346/tasks/abc346_c
Slide 12
Slide 12 text
12 もうちょっと難しい例
Slide 13
Slide 13 text
13 もうちょっと難しい例
Slide 14
Slide 14 text
14 実装例(?)
Slide 15
Slide 15 text
15 提出結果… →TLE(Time Limit Exceeded): 実行時間超過
Slide 16
Slide 16 text
16 ダメな理由 →20億回ループが回るので間に合わない
Slide 17
Slide 17 text
17 どうやって解くか →こっち(20万件)なら全部見ても間に合う
Slide 18
Slide 18 text
18 どうやって解くか ● 「現れないもの」の合計 – 2 + 4 + 5 = 11 ● 「全部の合計」から「現れるもの」を引いても同じ! – 1 + 2 + 3 + 4 + 5 = 15 – 15 – (1 + 3) = 11
Slide 19
Slide 19 text
19 正解例
Slide 20
Slide 20 text
20 正解例 →1からKまでの合計を求める関数を作る。計算で求めるので速い
Slide 21
Slide 21 text
21 正解例 重複を排除 1からKの合計値を求める 現れる数を引く 最大20万件なので十分速い
Slide 22
Slide 22 text
22 提出結果 →AC!
Slide 23
Slide 23 text
23 競プロとプログラム実装 ● ただの実装作業ゲーとは限らない – それなりに頭を捻ることになる – プログラムの実行時間も考える必要がある ● ちゃんと実装しきる必要もある – やってみると意外と大変…
Slide 24
Slide 24 text
24 プログラミング言語について ● AtCoderの場合、メジャーな言語ならだいたい使える ● 実際に使われているのは圧倒的にC++ – 次点でPython – だいたいどちらかがおすすめされる ● それら以外の言語も全く使われないわけではない
Slide 25
Slide 25 text
25 使用言語についての私見 ● 好きなのを使えばいい – せっかくいろいろ対応しているので ● 個人的にはKotlinを使っている – そんなに問題なくて2年くらい使っている
Slide 26
Slide 26 text
26 JVM言語(Kotlin)を使って得た実感 ● そこそこ安心できる実行速度 – オートボクシング/アンボクシングで遅いことはある ● バグなく実装しやすい – コンパイラのチェック、型安全性 ● fluentなリスト操作は競プロでも活きる(※私見) ● 不利な点も – 公式解説のコードはだいたいC++かPythonで書かれる – C++やPythonにあるがJavaやKotlinにはないライブラリも
Slide 27
Slide 27 text
27 競プロに取り組んで得た実感 ● 実装力が鍛えられる – ちゃんと動くコードを素早く書く必要がある – 入念に動作確認している時間がない ● 業務外で日常的にプログラミングする手段になる – 作る物のアイデアがなくてもプログラミングできる – テストされるのでそれなりにちゃんと書く必要がある ● プログラミングが楽しいと思えた
Slide 28
Slide 28 text
28 辛い点も… ● それなりに時間を吸われる – コンテスト参加のための時間 ● 提出が通らないが全然原因がわからないことも ● 良い成績がとれるとは限らない ● 身につく力の範囲は局所的
Slide 29
Slide 29 text
29 代表的なコンテスト ● AtCoder Beginner Contest(ABC) – オンラインコンテスト – ほぼ毎週開催される ● だいたい土曜日(たまに日曜日) ● 21:00 ~ 22:40の100分間 – 直近では7問出題される ● 難易度が幅広いのでだいたい誰でも参加できる
Slide 30
Slide 30 text
30 まとめ ● 競プロは日常的にプログラミングする手段の一つとなる – 個人開発のネタがなくてもプログラミングできる – 実装力を鍛えられる – 楽しい ● 始めるならAtCoderがおすすめ ● JavaやKotlinでも戦える