ABC324の回
参考リンク
https://atcoder.jp/contests/abc324
日本レジストリサービス(JPRS)プログラミングコンテスト2023
(AtCoder Beginner Contest 324)
https://qiita.com/kubochiro/items/5daedd51654a8155bc06
Python zip()関数についてあれこれ
https://qiita.com/hyouchun/items/98b53e9dc8cc0b99e1fe
ABC324をPythonで解いてみたよ。(A~E問題)
A-問題
問題文
N 個の整数 が与えられます。
これらの値がすべて等しいならば Yes 、そうでなければ No と出力してください。
ポイント
setに格納するのがシンプル。
最初から、setを使うことを思いついたがタイピングに時間がかかってしまった。
# 2023/10/15 本番解答
# 入力
N = int(input())
A = list(map(int,input().split()))
ST = set()
for i in range(N):
a = A[i]
ST.add(a)
if len(ST) == 1:
print("Yes")
else:
print("No")
もっと簡素化して書けることを学んだ
N = int(input())
ST = set(map(int,input().split()))
if len(ST) == 1:
print("Yes")
else:
print("No")
B-問題
問題文
正の整数 N が与えられます。
N=2x3yを満たす整数x,y が存在するなら Yes 、そうでなければ No と出力してください。
全探索してTLE。単純に割り切れるまで計算するのがシンプルで勉強になりました。
ポイント
単純に割り切れるまで計算する
# 入力
N = int(input())
# 2で割り切れるまで割る
while N % 2 == 0:
N //= 2
# 3で割り切れるまで割る
while N % 3 == 0:
N //= 3
if N == 1:
print("Yes")
else:
print("No")
C-問題
条件を関数でチェックする方針で書いたが、時間内に正解できなかった。
文字長が異なる場合で1文字ずつチェックするアイデアでしっくりするものが浮かばず。
勉強になりました。
ポイント
・zip関数を使う for a , b in zip(A, B):
・リストを改行して出力 print(*ans)
# 文字長が同じ場合のチェック関数
def diffchk(A,B):
diffcnt = 0
# zip は、2つのリストをペアとしてまとめる関数
for a , b in zip(A, B):
if a != b:
diffcnt += 1
if diffcnt <= 1:
return True
# 文字長が1つ違いの場合のチェック関数
def strchk(A,B):
# Aの文字長が長いときは、AとBを入れ替える Bが必ず長い文字
if len(A) > len(B):
A, B = B, A
j = 0
# 1文字ずつチェックする
for i in range(len(A)):
if A[i] == B[j]:
j += 1
continue
j += 1
if i + 1 != j: # 添え字が合わなければ False
return False
if A[i] == B[j]: # 次の1文字の一致判定
j += 1
else:
return False
return True
# 入力
N,T = map(str,input().split())
N = int(N) # Nは、整数型
ans = [] # 答えは、リストに格納する
for i in range(1, N + 1):
S = str(input())
# 文字長が一致している場合の判定
if len(S) == len(T):
if diffchk(S,T):
ans.append(i)
# 文字長が1つ文字違いの判定
elif abs(len(S) - len(T)) == 1:
if strchk(S,T):
ans.append(i)
print(len(ans))
print(*ans) # リストを改行で出力