読者です 読者をやめる 読者になる 読者になる

TopCoderを始めました

資格試験の気分転換に、以前から気になっていたTopCoderに手をつけてみました。導入含め、約1時間ほどかかりました。

TopCoderを知ったきっかけ
業務でアルゴリズムの知識が必要になる時があったのですが、大学時代に学んだ知識を瞬時に取り出せず、悔しい思いをしました。何か良いトレーニングはないものかと探し、その時に見つけたのがTopCoderです。国内だけでなく、世界のプログラマーと争えます。いわゆる競技プログラミングです。詳しい話は省略します。

早速解いてみたのですが、知識が全然ない自分でも簡単な問題なら解けました。全て英語で書かれていますが、予想以上に敷居が低くて驚きました。こんな簡単な問題も一部出題されているとは思いもしませんでした…。

左にTopCoderの問題、右にiTerm2(Vim)を置いてコーディングしました。
f:id:nikuyoshi:20130103021310p:plain

public class Time{
    public static void main(String[] args){
        String a = whatTime(0);
        String b = whatTime(3661);
        String c = whatTime(5436);
        String d = whatTime(86399);
        System.out.println(a);
        System.out.println(b);
        System.out.println(c);
        System.out.println(d);
    }
    public static String whatTime(int seconds){
        if(seconds > 86399) return "Error!";
        int second = seconds % 60;
        System.out.println(second);
        int minutes = ((seconds - second) / 60) % 60;
        System.out.println(minutes);
        int hour = ((seconds - minutes * 60 - second) / 3600) % 24;
        System.out.println(hour);
        String time = hour + ":" + minutes + ":" + second;
        return time;
    }
}

問題を解いた後の気づき
時間制限を設けて*1早く解こうとすると、ものすごい醜いコードを書いてしまうのに気づきました。そもそも、アルゴリズムの勉強のために始めたのですが、まさか違う問題が浮き彫りになると思いませんでした。一度も競技プログラミングに参加したことがなかったので、まさかこうなるとは…。

早く、かつ美しいコードが書けるように今後も時間を見つけては解いていきたいと感じました。

*1:過去問だったので自分で設定しました