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の大きいほうの点数を採用します。



