見出し画像

AtCoder Beginner Contest 168を見直す

全体の所感

今回もC問題でハマった。先に進むにはもうちょっと経験値が必要だなぁと思う。ただ、今回のC問題は今まで経験したことのない系統だったので解けたときに気持ちよかった。特にお金もかからず楽しめるのでいい娯楽だなと思った。

A - ∴ (Therefore)

数字が入力されるので、一の位の値に応じて出力を分岐する問題、以下のように回答

N = int(input()) % 10
if N == 2 or N == 4 or N == 5 or N == 7 or N == 9:
 print('hon')
elif N == 0 or N == 1 or N == 6 or N == 8:
 print('pon')
else:
 print('bon')

一の位の値を「%10」で求めたのは進化したところです。以前なら「[-1]」で求めていたに違いない。分岐の書き方はいまいちでしたね。そのとき思いつかなかったですが、以下のように「in」を使うのがみやすいですね。次から使っていこうと思います。

N = int(input()) % 10
if N in (2, 4, 5, 7, 9):
    print('hon')
elif str(N) in '0168':
    print('pon')
else:
    print('bon')

文字列だと「,」打たなくていい分早いですが、数字をあえて文字に変換してってのいうのはなんとなく好きじゃないな。

B - ... (Triple Dots)

Webページとか作っててもよくあると思われる、文字列がある程度以上であれば、文字列をきって「...」をお尻につける問題。以下のように回答

K = int(input())
S = input()
if len(S) > K:
   print(S[:K] + '...')
else:
   print(S)

これはみなさんこんな感じで回答されてる気がします。むしろA問題の方が難しかったかもしれないな。

C - : (Colon)

時間と針の長さが与えられるので、時計の時針と分針の先っぽの距離を求める問題

以下のように解きました。

import math
A, B, H, M = map(int, input().split())
tan_kaku = H * 30 + M * 0.5
cho_kaku = M * 6
tan_x = math.cos(math.radians(tan_kaku)) * A
tan_y = math.sin(math.radians(tan_kaku)) * A
cho_x = math.cos(math.radians(cho_kaku)) * B
cho_y = math.sin(math.radians(cho_kaku)) * B
print(math.sqrt((tan_x - cho_x)**2 + (tan_y - cho_y)**2))

単純に時針と分針の先の座標を出して、その座標の位置を求めました。これ正解したときには非常に気持ちよかったんですが、解説をみてもう一歩だったなと思いました。ちなみに解説で書かれているのは以下

import math
A, B, H, M = map(int, input().split())
tan_kaku = H * 30 + M * 0.5
cho_kaku = M * 6
rad = math.radians(abs(tan_kaku-cho_kaku))
print(math.sqrt(A**2 + B**2 - 2 * A * B * math.cos(rad)))

余弦定理ですね。去年「数I」をやり直したはずなんですが、なかなか出てこないものですね。ちょっと残念です。

ちなみに余弦定理は以下を参照ください。

見慣れない座標とか使ったので、D問題にたどり着いたときには、終了10分前でした。全く手がつけられなかったD問題については時間に余裕があれば見直ししていこうと思います。

この記事が気に入ったらサポートをしてみませんか?