ハードウェアエンジニアの守破離

国内電機メーカーに勤務しているハードウェアエンジニア

Atcorder_ABC199:C問題のTLE解決できず

参加は二回目ですが、残念ながらA, Bの2完。

当分はCまでの完答を目標にしていたので、早くも残念な結果に。

Cはアルゴリズムは構築できたが、規定時間内に処理できないため提出できず。

提出したコードの記録を残すとともに、C問題の解析を実施しました。

A問題

a, b, c = map(int, input().split())
if (a**2)+(b**2) < (c**2):
print("Yes")
else:
print("No")

1分30秒で提出。

B問題

A = []
B = []
N = int(input())

A = list(map(int, input().split()))
B = list(map(int, input().split()))

if min(B)-max(A)+1 > 0:
print(min(B)-max(A)+1)
else:
print(0)

7分30秒で提出。

C問題

自身が提出したコード:TLE

N = int(input())
S = input()
Q = int(input())
s = list(S)
# 以降、Sはリストとして扱う
for i in range(Q):
t, a, b = map(int, input().split())

if t == 2: # 前半後半を入れ替える
s[0:N], s[N:2 * N] = s[N:2 * N], s[0:N]

else: #AiBiを入れ替える
s[a - 1], s[b - 1] = s[b - 1], s[a - 1]
S = "".join(s)
print(S)

2213 ms (制限時間2,000msなので、213msオーバー (>_<)

・文字列Sは即座にリストsに変換する (例: FLIP→'F', 'L', 'I', 'P')

・クエリ先頭tに応じて分岐処理する (2 or 1)

解答例:AC

N = int(input())
S = input()
Q = int(input())
s0, s1 = list(S[:N]), list(S[N:2*N])
# 以降、Sはリストとして扱う
for i in range(Q):
t, a, b = map(int, input().split())

if t == 2: # 前半後半を入れ替える
s0, s1 = s1, s0

else: #AiBiを入れ替える
if b <= N:
s0[a-1], s0[b-1] = s0[b-1], s0[a-1]
elif N < a:
s1[a - 1 -N], s1[b - 1 - N] = s1[b - 1 - N], s1[a - 1 - N]
else:
s0[a - 1], s1[b - 1 - N] = s1[b - 1 - N], s0[a - 1]

S = "".join(s0 + s1)
print(S)

実行時間:459 ms (約1/5の処理時間に短縮)

・文字列Sは即座に2つのリストに分解する

【メリット】

・各リストが最大2×10^5文字まで短縮でき、前半後半の入れ替えがスムーズ

(分割しない場合、最大4×10^5文字になる可能性がある)

f:id:Subarukun:20210425001424p:plain

今回の反省点

  • 日々、計算時間を配慮に入れた演習を心がける
  • 処理時間が早い参加者のコードを参照して写経する
  • 処理内容に応じてリスト分割できないか試験中に検討する

 

 

 

Atcorder_ABC198:初学者がAtcorder初参戦!

Pythonに触れて約4か月経過したので、初めてAtcorderのABC198に参加してみました。

結果は時間内にA, B, Cに回答。初学者にしては良い船出だったと思います。

成長記録としてこれから毎回ブログに残そうかな…(できるかな?)

灰色が当面の目標が茶色なので。えっ…今回の成績じゃ全然ダメなの?

と思いきや、初参加時のリセマラ防止の強い下方補正がかかったようです。

当分の間、以下の方針で勉強しようと思います。

【方針】

・コンテストに慣れるため、ABCには必ず参加する

・復習は必ず実施して、本番のハマったポイントは必ず明確化する

・継続が力になると信じて、毎日必ず1問演習する

 

以下が生々しい初学者の提出コードと回答例

A問題

n= int(input())
if n <= 1:
print(0)
else:
  print(N-1)

1で場合分けした意味よ…

# 模範回答例
N = int(input())
print(N-1)

B問題

n = input()
# print("文字数", len(n))
# print("N:",n)
# print("reverseN:",n[::-1])
if n == n[::-1]:
print("Yes")
else:
for i in range(len(n)):
if n[-1-i] == '0':
n = '0' + n
else:
break
# print(n)
if n == n[::-1]:
print("Yes")
else:
print("No")

 文字列[::-1]で逆になることが個人的なポイントでした。

#模範回答例
S=input()
for i in range(10):
T = "0"*i + S
if T==T[::-1]:
print("Yes")
exit()
print("No")

 

C問題

r, x, y = map(int, input().split())
l = (x**2 + y**2)**0.5
sho = l // r
amari = l % r
# print("距離",l)
# print("1歩で進む距離",r)
# print("直線歩数",sho)
# print("残り距離", l-sho*r)
# print("計算あまり",amari)
if amari == 0.0:
print(int(sho))
else:
if sho ==0:
print(2)
else:
# print(f"残りの距離は{l - r * int(sho-1)}です。")
print(int(sho)+1)

1歩で進む距離Rより目標座標が小さい場合の考慮を忘れて時間を無駄にしました。

ここをスムーズに気付けばDも解けたかも(?)

# 模範回答例
import math
R,X,Y=map(int,input().split())
D=math.sqrt(X*X+Y*Y)
if D==R:
print(1)
elif D<=R+R:
print(2)
else:
print(math.ceil(D/R))

 次回から込み入った計算を行う際にはmathライブラリを使用するか。

速度がどれだけ違うか検証してみようかな。

[Note]

math.ceil(): 小数点以下を切り上げ

math.floor(): 小数点以下切り捨て

 

f:id:Subarukun:20210413174417p:plain

 

f:id:Subarukun:20210411231950p:plain

毎回必ずABCには参加して早いとこ茶色になりたいところ。

 

【合格体験記】G検定の勉強法と本番の戦略

先日、一般社団法人日本ディープラーニング協会(JDLA)主催のG検定に合格しました。

G検定とは - 一般社団法人日本ディープラーニング協会【公式】

下記が受験後12日後に受信した結果通知メールです。

詳細な点数データや順位などは開示されないのですね。ちょっとがっかり。

合格率は約63.7%ですね。ぶっちゃけ難易度は低い資格です。

f:id:Subarukun:20210404205132p:plain

この記事では、自身の考える最短の合格ルートについて防備メモを残します。

あくまで合格できれば良い、かつ日常においても詳細な法律問題はその都度調べれば良いとの考えなので、特に仕事で法規を扱う上で勉強している方などには非推奨です。

まず、試験概要を改めて確認します。

f:id:Subarukun:20210404205520p:plain


試験時間は120分。問題は220問程度なので、完答には1問あたり約54秒で解く必要があります。

分野はシラバスに沿って満遍なく出題されますが、機械学習と深層学習が最頻出であり、残りは時事的な法律関連の問題、人工知能の歴史についてが次点です。

使用テキストと問題集は下記の2点を使用しました。

f:id:Subarukun:20210404211351p:plain            f:id:Subarukun:20210404211505p:plain

深層学習教科書 ディープラーニング G検定(ジェネラリスト) 公式テキスト

最短突破 ディープラーニングG検定(ジェネラリスト) 問題集

結論、この2冊だけで合格できます。

公式テキストはこれだけでは受からないじゃないかという恨み節に近いレビューが多く、評価も☆4以下です。しかし、だからといって代替書籍はありません、購入必須です。内容も平易でレイアウトも大変見やすく、読み物として単純に面白いので入手しましょう。知識定着させるためのアウトプットは、AVILENさんの問題集で補います。こちらも非常に分かりやすく、難易度が高い問題まで幅広く収録されているので十分対策効果がありました。上記書籍を何周かすれば、試験時間を30分以上余らせることができます。この余った時間でGoogleや手元の情報を参照して、自信のない問題を一気に片づけることもできます。大本営も制限時間内でパパっと正解に必要な情報を取り出せるかを確認する試験と位置付けているので、検索について黙認している状況です。

どの問題集でも時事的な法律関係の問題はカバーしきれません。

そこで、定石・定形問題を素早く解いて時間を稼ぎ、残り時間で自信のない問題や時事法律問題を一気に片づける。これが対策を終えた自身の考える最終的な戦略案です。

 

 

ブログ開設

国内電機メーカーに勤めているSubaruです。

中堅と呼ばれる年代に突入しましたが、社会人になってこれまで様々な学びを得てきました。このブログでは、電気工学で学んだ知識や知恵、雑多な趣味について徒然なるままに書き綴っていこうと思います。

読者の好奇心を刺激したり、私自身の忘備録となればいいなと考えています。

好奇心の赴くままに色々なことにチャレンジする性格なので、このブログも細々と長く続けられていけたらいいなと思います…


f:id:Subarukun:20220417205528j:image