LoginSignup
4
3

More than 3 years have passed since last update.

Pythonで解く【初中級者が解くべき過去問精選 100 問】(001 - 004 全探索:全列挙)

Posted at

1. 目的

初中級者が解くべき過去問精選 100 問をPythonで解きます。
すべて解き終わるころに水色になっていることが目標です。

本記事は「001 - 004 全探索:全列挙」になります。

2. 総括

Pythonでは組み合わせの列挙等はitertoolsでも行えるが、練習のためfor文で書いた。
特につまずくことはなかった。

3. 本編

001 - 004 全探索:全列挙

001. ITP1_7_B - How Many Ways?

image.png

回答

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文のfirstsecondthirdの範囲が重複しないように気を付けます。
具体的にはsecondのスタートをfirst+1thirdのスタートをsecond+1にします。


002. AtCoder Beginner Contest 106 B - 105

image.png

回答

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であるか否かをTrueFalseで返すis_targetという関数を作成します。
そのあと1~Nまでの奇数についてis_targetでチェックして足し合わせます(Trueは1なのでそのまま足せる)。


003. AtCoder Beginner Contest 122 B - ATCoder

image.png

回答

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から取り出す部分文字列は添え字startendを使ってS[start : end]と書けますので、startendそれぞれについて、ACGTであるか否かをチェックしていきます。

チェックの際は、startのfor文ではACGTじゃない場合はcontinueendのfor文ではACGTじゃない場合はbreakであることに注意します。


004. パ研杯2019 C - カラオケ

image.png

回答

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)

song1song2についてfor文を回します。
そしてその内側で各生徒(添え字i)についてsong1song2の大きいほうの点数を採用します。

4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3