pontz_rwのブログ

プログラミング等の備忘録

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) とすると、以下の条件を満たします。

  1. aは合計値xを3で割った数より小さい (a < x / 3)
  2. bは、合計値xからaを引いた数を2で割った数より小さい (b < (x - a) / 2)
  3. 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
ベクトルと行列の積についての問題

 c_i = \sum_{j=1}^m a_{ij}b_j  = a_{i1}b_1 + a_{i2}b_2 + \dots + a_{im}b_m
この式に沿って問題を解いていきます。


解答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]))