Coding_Gamesメモ_Graffiti_on_the_fence

javaの学習にCoding_Games を知り、学習の記録としてメモ。
To debug:

System.err.println( );

を使うとデバックしやすくなる。(エラー出力は評価に影響しない)

内容

塀を塗り替える仕事を受け、下請けに注文した。
Lメートルの塀があり、Nグループの下請けからメートル単位で作業の報告を受けている
残りの範囲を出力してください。

ルール

インプット

1行目 塀の長さ
2行目 報告の数
3行目から 作業した範囲を "st ed" の形式で入力

アウトプット

連続した作業していない範囲を"st ed"の形式で出力
途切れているなら改行を行う
全て作業が終わっていたら"All painted"を出力

使用したクラス

TreeMap

TreeMap<キーの型 , データの型> 名前 = new TreeMap<キーの型 , データの型>() ;

TreeMap.put(キー , データ)
キーとデータを登録

x = TreeMap.get(キー)
キーと紐づけられたデータを出力

(Boolean) = TreeMap.containsKey(x)
xがキーとして登録されているか

TreeMap.replace( x , y )
xがキーとして登録されていたら、データをyに置き換える

(Set) = TreeMap.keySet()
キーのリストをSetとして出力
for-each文に使える

x = TreeMap.ceilingKey(y)
y以上のキーを出力
y <= x

x = TreeMap.higherKey(y)
yを超えるキーを出力
y < x

考え方1-boolean配列を作る

すべての作業報告から全体の作業状況を作り、出力形式に合わせて出力

問題点

Javaでは配列の要素数はintのため要素数Lの配列を作れつはずだがlong fenceでjava.lang.OutOfMemoryError: Java heap space となってしまう
Coding_Games では要素が52,231,260個を超える配列を作ろうとするとエラーになる
英語の説明でも「できるけどオススメしない」みたいなことが書かれている

考え方2
作業報告を整理して、作業済み範囲をまとめ、まとめた範囲から作業を行っていない範囲を出力

すべて入力形式通りの数字の範囲で処理する

Coding_Games:https://www.codingame.com/
java 配列 上限解放|teratail: https://teratail.com/questions/135596
TreeMap (Java Platform SE 8) - Oracle Cloud:https://docs.oracle.com/javase/jp/8/docs/api/java/util/TreeMap.html