🔥
【AtCoder】ABC404をPythonで解く
1. はじめに
目的
ABCを解くことにより、とにかくRatingを上げていく。
注意点
言語はPython(PyPy 3.10-v7.3.12) を使用しています。
コンテスト情報
コンテスト名
AtCoder Beginner Contest 404
コンテストURL
開催日
2025-05-03(土) 21:00 ~ 2025-05-03(土) 22:40 (100分)
配点
問題 | 点数 |
---|---|
A | 100 |
B | 250 |
C | 300 |
D | 400 |
E | 475 |
F | 550 |
G | 600 |
結果
順位:7607/9579
総合 | A | B | C | D | E | F | G | |
---|---|---|---|---|---|---|---|---|
得点 | 350(2) | 100 | 250(2) | |||||
時間 | 106:43 | 8:59 | 96:43 |
2. 問題と解法
Not Found
A:コード
s = str(input())
words = [i for i in s if s.islower]
for j in [chr(ord("a")+i) for i in range(26)]:
if not(j in words):
print(j)
break
解法
- 与えられた文字列の中から、小文字であるものだけを抜き出してリスト
に格納する。words -
関数を使って、文字ord をアスキーコードに変換して、a から0 までを加えて、再度文字26 からa に変換する。z -
からa までの文字がリストz になければ、その時点での文字を出力してプログラムを終了させる。words
改善点
s = str(input())
- words = [i for i in s if s.islower]
for j in [chr(ord("a")+i) for i in range(26)]:
- if not(j in words):
+ if not(j in s):
print(j)
break
最初から小文字であることはわかっているので、
Grid Rotation
B:コード
n = int(input())
s = [list(input()) for _ in range(n)]
t = [list(input()) for _ in range(n)]
def rotation(s):
update = [[0]*n for _ in range(n)]
for i in range(n):
for j in range(n):
update[j][n-(i+1)] = s[i][j]
for i in range(n):
for j in range(n):
s[i][j] = update[i][j]
min_total = n * n + 4
s_copy = [[s[i][j] for j in range(n)] for i in range(n)]
for rotation_num in range(4):
change_num = 0
for i in range(n):
for j in range(n):
if s_copy[i][j] != t[i][j]:
change_num += 1
total = rotation_num + change_num
if total < min_total:
min_total = total
rotation(s_copy)
print(min_total)
解法
- グリッド
とS をT として保存する。list\ in\ list - グリッドを右に
度回転させるローテーション関数を定義する。90 - 回転数は
から0 回のいずれかであり、各々でグリッド3 とS の異なるマス(変更が必要なマス)の数を数えて変数T に代入する。change\_num - 変数
に回転数change\_num を加えたものが操作回数であり、これが最小になる値rotation\_num が求める値である。min\_total
改善点
- s = [list(input()) for _ in range(n)]
- t = [list(input()) for _ in range(n)]
+ s = [input() for _ in range(n)]
+ t = [input() for _ in range(n)]
グリッド
- def rotation(s):
- update = [[0]*n for _ in range(n)]
- for i in range(n):
- for j in range(n):
- update[j][n-(i+1)] = s[i][j]
- for i in range(n):
- for j in range(n):
- s[i][j] = update[i][j]
+ def right_rot(S):
+ return list(zip(*S[::-1]))
リストを使って回転を行い、それをまた代入し直す処理を行なっても問題ないが、
スライス
この作業を逆に行うことで、左回転も可能である。
Discussion