JVM言語でもできる、競技プログラミング
by
dhirabayashi
×
Copy
Open
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
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でも戦える