1. 目的
初中級者が解くべき過去問精選 100 問をPythonで解きます。
すべて解き終わるころに水色になっていることが目標です。
本記事は「001 - 004 全探索:全列挙」になります。
2. 総括
Pythonでは組み合わせの列挙等はitertools
でも行えるが、練習のためfor文で書いた。
特につまずくことはなかった。
3. 本編
001 - 004 全探索:全列挙
001. ITP1_7_B - How Many Ways?
回答
answer_list = []
while True:
n, x = map(int, input().split())
if n == 0 and x == 0:
break
count = 0
for first in range(1, n + 1):
for second in range(first + 1, n + 1):
for third in range(second + 1, n + 1):
if first + second + third == x:
count += 1
answer_list.append(count)
for answer in answer_list:
print(answer)
問題文は重複無しとあるので、for文のfirst
、second
、third
の範囲が重複しないように気を付けます。
具体的にはsecond
のスタートをfirst+1
、third
のスタートをsecond+1
にします。
002. AtCoder Beginner Contest 106 B - 105
回答
def is_target(num):
count = 0
for i in range(1, num+1):
if num % i == 0:
count += 1
if count == 8:
return True
else:
return False
if __name__ == "__main__":
N = int(input())
count = 0
for num in range(1, N+1, 2):
count += is_target(num)
print(count)
約数が8であるか否かをTrue
、False
で返すis_target
という関数を作成します。
そのあと1~Nまでの奇数についてis_target
でチェックして足し合わせます(Trueは1なのでそのまま足せる)。
003. AtCoder Beginner Contest 122 B - ATCoder
回答
target = 'ACGT'
S = input()
answer = 0
for start in range(len(S)):
if S[start] not in target:
continue
count = 0
for end in range(start, len(S)):
if S[end] not in target:
break
count += 1
answer = max(answer, count)
print(answer)
文字列Sから取り出す部分文字列は添え字start
とend
を使ってS[start : end]
と書けますので、start
とend
それぞれについて、ACGT
であるか否かをチェックしていきます。
チェックの際は、start
のfor文ではACGT
じゃない場合はcontinue
、end
のfor文ではACGT
じゃない場合はbreak
であることに注意します。
004. パ研杯2019 C - カラオケ
回答
N, M = map(int, input().split())
A = [list(map(int, input().split())) for _ in range(N)]
answer = 0
for song1 in range(M):
for song2 in range(song1+1, M):
score = 0
for i in range(N):
score += max(A[i][song1], A[i][song2])
answer = max(answer, score)
print(answer)
song1
とsong2
についてfor文を回します。
そしてその内側で各生徒(添え字i
)についてsong1
とsong2
の大きいほうの点数を採用します。