ITP1_8_B: Sum of Numbers
数字の和 | プログラミング入門 | Aizu Online Judge
文字列操作に関する問題
1. 入力を文字列として受け取った場合
map()
を使用し、受け取った文字列を1文字ずつ整数型に変換し、その合計を出力します。
# coding: utf-8 while True: line = input() if line == '0': break else: print(sum(map(int, line)))
2. 入力を整数として受け取った場合
入力値を10で割り続け、0になるまでの間、10で割った剰余を加算し、最後にその合計を出力します。
# coding: utf-8 while True: n = int(input()) if n == 0: break else: sum = 0 while n > 0: sum += n % 10 n //= 10 print(sum)
ITP1_8_A: Toggling Cases
小文字と大文字の変換 | プログラミング入門 | Aizu Online Judge
文字列操作に関する問題
1. swapcase()を使う場合
swapcase()
を使用することで、大文字を小文字に、小文字を大文字に変換することができます。
print(input().swapcase())
2. islower()、もしくはisupper()を使う場合
入力文字列を1文字ずつ比較し、True
の場合に変換します。
s = input() for c in s: if c.islower(): print(c.upper(), end="") else: print(c.lower(), end="") print()
ITP1_7_D: Matrix Multiplication
行列の積 | プログラミング入門 | Aizu Online Judge
行列, の積を求める問題
行列の各要素は行列の行目の各要素と、行列の列目の各要素の積を合計したものです。
行列の行列を入れ替えた転置行列を用意すれば、行同士の演算で行列が求められます。
- 行列, を作成し、転置行列は
zip()
を使用し求めます。 - 次に、for文を使用し、行列の行
a
を取り出します。a
に対して、転置行列の行b
を取り出し、それぞれの要素を掛け合わせたものの合計を求め、結果をリストc
に格納します。 - 転置行列のすべての行
b
に対して同様の処理をし、c
を出力することで、行列の1行目を出力したことになります。 - これを、行列のすべての行
a
に対して同様の処理をすることで、行列を出力します。
解答
n, m, l = map(int, input().split()) matrix_A = [list(map(int, input().split())) for _ in range(n)] matrix_B = [list(map(int, input().split())) for _ in range(m)] matrix_B_transposed = list(map(list, zip(*matrix_B))) for a in matrix_A: c = [] for bt in matrix_B_transposed: c.append(sum(x * y for (x, y) in zip(a, bt))) print(*c)
ITP1_7_C: Spreadsheet
表計算 | プログラミング入門 | Aizu Online Judge
行列に関する問題
はじめに、r × c の表を作成します。
次に、各行の合計をappend()
を使用してmatrix
の各行の最後に結合し、 r × (c + 1) の表を作成します。
そして、各列の合計をzip()
を使用して、matrix
の最後に結合し、 (r + 1) × (c + 1) の表を作成します。
解答
r, c = map(int, input().split()) matrix = [list(map(int, input().split())) for _ in range(r)] for i in range(r): matrix[i].append(sum(matrix[i])) matrix.append(list(map(sum, zip(*matrix)))) # matrix.append([sum(i) for i in zip(*matrix)]) for row in matrix: print(' '.join(str(e) for e in row))
ITP1_7_B: How many ways?
組み合わせの数 | プログラミング入門 | Aizu Online Judge]
組み合わせの数を求める問題
選ぶ3つの数をa, b, c (a < b < c) とすると、以下の条件を満たします。
- aは合計値xを3で割った数より小さい (a < x / 3)
- bは、合計値xからaを引いた数を2で割った数より小さい (b < (x - a) / 2)
- cは、選択できる数字の範囲内である (c <= n)
解答
while True: n, x = map(int, input().split()) if n == x == 0: break cnt = 0 for a in range(1, x // 3): for b in range(a + 1, x // 2): c = x - a - b if b < c <= n: cnt += 1 print(cnt)
ITP1_7_A: Grading
成績の判定 | プログラミング入門 | Aizu Online Judge
複数の条件分岐がある問題
条件分岐の順番に気を付ければ溶ける問題です。
解答
while True: m, f, r = map(int, input().split()) score = m + f if m == f == r == -1: break elif m == -1 or f == -1: print('F') elif score >= 80: print('A') elif score >= 65: print('B') elif score >= 50 or (score >= 30 and r >= 50): print('C') elif score >= 30: print('D') else: print('F')
ITP1_6_D: Matrix Vector Multiplication
行列とベクトルの積 | プログラミング入門 | Aizu Online Judge
ベクトルと行列の積についての問題
この式に沿って問題を解いていきます。
解答1
n, m = map(int, input().split()) A = [] b = [] # 行列Aに要素を追加 for i in range(n): A.append([int(s) for s in input().split()]) # 列ベクトルbに要素を追加 for i in range(m): b.append([int(input())]) # Aとbの積を出力 for i in range(n): sum = 0 # 列ベクトルc_iを求める for j in range(m): sum_i += A[i][j] * b[j][0] # 列ベクトルc_iを出力 print(sum_i)
解答2
リスト内包表記を利用し、簡潔にしています。
n, m = list(map(int, input().split())) A = [list(map(int, input().split())) for i in range(n)] bt = [int(input()) for i in range(m)] for i in range(n): print(sum([x * y for (x, y) in zip(A[i], bt)]))