154.1

なんとなく過去問を解いてみる。昔の問題は解けそうで解けるというか、難易度がやや低めというか。特にこのセットは微妙...。

350 (level1)

ユーザの入力コードがどのチートコードにマッチするかという問題。ただしユーザ入力には若干の曖昧性が許されて、複数回の連続する同一キーの入力を一回の入力とカウントすることができる。


取り敢えず力技でいくらでも解けるが、正規表現を使うのが正解らしい。みんな賢いなぁ。Java正規表現を何も見ずに書ける気はしないなぁと思ったけれど、普通にStringクラスの中で足りるらしい。

str.matches(pattern);

ただし、これだと完全一致じゃないといけないっぽいので、若干不便。.*とかで両端を埋めるのは気分が良くないし。

str.replaceFirst(pattern, "");
str.equals(orig); // これが!matchに相当

とかいうアドホックな方法もあるけれど、どっちも幸せにはなれなさそうだなぁ。

500 (level2)

色々なジャンルで採点した結果が渡されるから、同じジャンル内での順位を計算して、全ジャンル合計の順位から、全体の順位を付ける。同点なら全部の採点結果の合計で順位を付ける。それでも同点なら、名前順に並べる。というソートを実装して、フォーマットするだけ。面倒なだけ。

1000 (level3)

a=b という形式で同一視できるものがリストされているので、その制約を満たす時に、どれだけの順列が作れるか、という問題。


取り敢えず全部同一視できるものを並べてグループ化して、グループ間の関係を全通り計算すればいいだけ。最も単純なDPで解ける。


この問題の肝は、ちゃんと真面目にグループ化しないとダメだよ、ということらしい。