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)]))
ITP1_6_C: Official House
公舎 | プログラミング入門 | Aizu Online Judge
配列に関する問題
多次元配列を利用します。
解答
houses = [[[0 for r in range(10)] for f in range(3)] for b in range(4)] n = int(input()) for i in range(n): b, f, r, v = map(int, input().split()) houses[b - 1][f - 1][r - 1] += v for b in range(4): for f in houses[b]: print('', *f) if b != 3: print('#' * 20)
ITP1_6_B: Finding Missing Cards
なくなったカードの発見 | プログラミング入門 | Aizu Online Judge
不足しているカードを指定された順序で表示する問題
トランプのリストを用意しておき、指定されたカードをフラグで管理するか、取り除くかします。
解答1
# トランプの生成 cards = [ "{} {}".format(s, r) for s in ('S', 'H', 'C', 'D') for r in range(1, 13 + 1) ] count = int(input()) # トランプの削除 for n in range(count): card = input() cards.remove(card) # 不足しているトランプの表示 for n in cards: print(n)
解答2
from collections import OrderedDict # トランプの生成 cards = OrderedDict() # 順序付き辞書 for s in ['S', 'H', 'C', 'D']: for r in range(1, 13 + 1): key = "{} {}".format(s, r) cards[key] = False count = int(input()) # 所持しているトランプの処理 for n in range(count): input_key = input() cards[input_key] = not(cards[input_key]) # 真理値を反転 (Trueへ) # 不足しているトランプの表示 for k, v in cards.items(): if not v: print(k)
ITP1_6_A: Reversing Numbers
数列の反転 | プログラミング入門 | Aizu Online Judge
リストを逆順にする問題
解答1
reverse()
を使用してリストを逆順にしています。
input() list = input().split() list.reverse() print(" ".join(list))
解答2
リストに対して[::-1]
を指定することで逆順にできます。
input() print(" ".join(input().split()[::-1]))