概要
今回は、プログラミングゲームの解答コードを投稿しよう!のQiita公式イベントの記事となります。
paizaの新作プログラミングゲーム 「電脳少女プログラミング2088 ─壊レタ君を再構築─」 の「ギャングのアジト(Bランク)」に挑戦しました。本記事では、提出したコードの解説を行います。
開発方針
- 処理時間とメモリ使用量をできるだけ抑え、効率性をあげる
- 可読性の高いコードを心がける
- 使用言語は、Python3を選択
問題概要
標準入力から以下のフォーマットでデータが与えられます。
1行目にピクセルアートのサイズが与えられ、2行目以降にピクセルアートの配置が記述されます。
このピクセルアートが左右対称であるかを判定し、左右対称なら「Yes」、左右非対称なら「No」と出力してください。
例1)
5
0 0 1 0 0
0 1 1 1 0
1 1 1 1 1
0 1 0 1 0
0 0 1 0 0
→ 左右対称なので「Yes」 と出力
例2)
3
0 0 0
1 1 0
0 0 1
→ 左右非対称なので「No」 と出力
処理方式
コードを書く前に、処理方式を整理しちゃいます。
今回の問題のキーとなるのは、「左右対称の判定方法」です。
配列の中身を1つずつチェックしていけば、コーディングできますが処理内容が複雑になってしまい、可読性や効率性の面では良くありません。
今回は渡されたピクセルアートを反転したものと比較することで、判定を行います。
また、行ごとにチェックし左右非対称となる場合は、その時点で処理を終了して不要な処理を省くようにします。
提出コード
コード量はこれだけです。(コーディング時間は、10分くらいでした)
# coding: utf-8
n = int(input())
for _ in range(n):
l = list(map(int, input().split()))
if l != l[::-1]:
print('No')
break
else:
print('Yes')
コード解説
1. 標準入力の受け取り
下記コードは、ピクセルアートのサイズを取得し、あとのループ処理で使用するためint型
を指定しています。
n = int(input())
下記コードは、ピクセルアートの1行分を取得する処理です。
list
やmap
やsplit
などを使っていますが、これは競技プログラミングにおける標準入力の取得方法としてよく使われる手法です。「こういうものだ」と覚えておくと便利かもしれません。
変数l
にはlist型
で[0, 0, 1, 0, 1]
といった内容が格納されます。
l = list(map(int, input().split()))
2. for-else
Python特有のfor-else構文
を使って、ループ処理が正常に終わったときのみYes
を出力するようにしました。
for _ in range(n):
# ループ内の処理
else:
print('Yes')
3. 左右非対称の判定
l[::-1]
で リストを逆順にした新しいリストを作成するスライス構文です。
ここで左右非対称と判定された場合に、No
を出力したあとbreak
でループ処理を抜けます。
if l != l[::-1]:
print('No')
break
結果
Bランクの問題なので、処理時間は余裕ですね!
終わりに
今回は、paizaのBランクの問題を解いてみました。
paizaのスキルチェックだと、どのように改善したら良いかや答えが分からなかったりするので、このようなイベントで他人のコードを確認できるのが嬉しいですね。
また、paizaの問題の画面だと、様々な標準入力のパターンを試せなかったため、paiza.io を使って試しました。ブラウザだけで様々な言語の実行が試せるのでよく使っています。プログラム初心者ほど使ったほうがいいと思うので、ぜひ触ってみてください。
ここまで読んで頂きありがとうございました。