プログラミングを上達させたい

情報学専攻の大学院→放送局でCMの営業など@大阪→舞台俳優&IT営業@東京

AtCoder Beginner Contest #010 A〜C問題をschemeで

AtCoder Beginner Contest #010に参加しました。
A〜C問題は簡単に解けたのですが、D問題がさっぱり・・・
この辺が、1つの壁のような気がします。
超えるには、まだまだ経験も必要ですし、お勉強も必要なような。

さて、今回解けた3問は全てschemeで解きました。


まず問題Aのコードはこんな感じ。

(display (read))
(display "pp")
(newline)

そして実行にかかった時間はなんと1829ms・・・
どうしろと言うんでしょうか。まぁ解けてるからいいか。

そして問題B
数字での場合分けですね。入力される花びらの数は1以上10未満なので、少し上手く解こうとして時間がかかるくらいなら、1〜10枚まで実際にやってみるのもありですね。
コードはこんな感じ。

;3n+2
;2nがダメ
(define n (read))
 
(define (answer maisuu)
  (cond ((and (= (modulo maisuu 2) 1) (< (modulo maisuu 3) 2))
         0)
        ((and (= (modulo maisuu 2) 1) (= (modulo maisuu 3) 2))
         2)
        ((and (= (modulo maisuu 2) 0) (= (modulo maisuu 3) 2))
         1)
        ((and (= (modulo maisuu 2) 0) (= (modulo maisuu 3) 1))
         1)
        (#t 3)))
 
(define (solve times wa)
  (if (= times 0) wa
      (solve (- times 1) (+ wa (answer (read))))))
 
(display (solve n 0))
(newline)

これの実行時間は343ms。1問目の1/4以下です。どういうことなんでしょうね。文字列の出力が時間かかるのか?うーん。


問題Cは、距離を求めて、ってやつでしたね。僕の実力では、ここまでは簡単、4問目だけめちゃくちゃ難しい、という実感でした。多分、最近ずっとこのくらいの実力で停滞してるんだと思います。
3問目のコードはこちら。

(define (square x) (* x x))
(define txa (read))
(define tya (read))
(define txb (read))
(define tyb (read))
(define candistance (* (read) (read)))
(define nn (read))
(define (cango xx yy)
  (if (<= (+ (sqrt (+ (square (- xx txa)) (square (- yy tya))))
            (sqrt (+ (square (- xx txb)) (square (- yy tyb))))) candistance) #t
                                                                             #f))
(define (solve times)
    (if (= times 0) #f
        (let* ((thisx (read)) (thisy (read)))
          (if (cango thisx thisy) #t
              (solve (- times 1))))))
(define ans (if (solve nn) "YES" "NO"))
                                                                              
(display ans)
(newline)

これの実行時間は459msでした。


そして4問目はJavaで解こうとして、色々考えたのですが、思いついた解法が合っているかも自信が持てないし、その思いついた解法の実装が上手くできない&めちゃ時間かかる、という感じでした。
アルゴリズム力、実装力の両方が足りていない状態ですね。
アルゴリズムに関しては、例えば木とか、そのいった基礎レベルのところで抜けてる部分が結構あるので、まずはそれをやらんことにはな、と思います。本を読んで理解して書いてみて、と地味な作業になりますが、コツコツやっていくしかないですね。
実装力に関しては、もっとコードを書くしかないと思います。難しい問題をなんとなく避けてるので、WAを出しながら何回も書いて書いて、をしていくべきなのだと思います。嫌だなぁ・・・


とりあえず、今回の問題の解説スライドを読んで、今回のD問題を解いてみます。

今回は以上です。