はじめに
社内外の優秀なエンジニア達から「技術トークが多少わかる採用担当」として信頼を得たいと思い2020年6月から参加を始めた競技プログラミング。当時の職場のプロダクト開発で使用していたJavaScriptを使っていたが、2021年5月に開催された以下の大会から初学者にやさしいと言われるPythonに変更した。
採用の仕事からは離れたが、せっかくなので競プロを今度は仕事のためでなく自分のために続けようと思ったからだ。
学びやすい言語に変えたはいいが、実力を示すポイントである"Rating"が一向に上がらない(むしろ下がっている)。忙しさを言い訳に復習せずに本番に臨み続けているので当たり前だがなんとかできないものかと悩んでいたら、コンテスト後に公開される模範解答にPythonの実装例が追加されていることにある時気づいた。
そんなコンテンツやメンターをしてくれている友人エンジニアからのコメントをふまえて、直近開催された回で不正解となった問題の復習をした。気づきをここにまとめる。
ABC213 復習
問題
自分の誤答
# -*- coding: utf-8 -*-
N = int(input())
A = list(input().split(" "))
B = [[0] *2 for i in range(N)]
for i in range(N):
B[i][0] = A[i]
B[i][1] = i
B.sort()
print(A[len(A)-2][1]+1)
学び・気づき
敗因
- split()メソッドは文字列のリストを返すことを知らなかった
- 整数に変換する必要があった
- 最後にprintする配列を勘違いしていた・・
模範解答からの学び
-
シンプルな書き方
A = list(map(int,input().split()))
-
区切り文字が空白であればsplit()メソッドの引数は省略可能
- 組になっているものを扱うときはタプルを使う
- リスト用意→append()メソッドでタプル要素追加
- 「最後から2番目」は「逆順から並べれば最初から2番目」
おわりに
最近ABCの出題形式が大きく変わった。
ハイレベルな人たちは同じ時間でより多くの問題を解くための取捨選択が大事だと語っているが、100点相当のA問題や200相当のB問題の難易度も上がっているような感覚がある。私のような本当のビギナーにもこの変更はインパクトがあった(と思う)。
1年前の自分のQiita記事を久しぶりに読み返したところ「C問題まで解けるようになることが目標」と繰り返し書いていた。退化しているようで悲しさもあるが今はB問題までを安定して解けるようになることが先決。今回のような復習記事も書きつつ、楽しくレベルアップできればいいなと思う。