pontz_rwのブログ

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

ITP1_8_D: Ring

リング | プログラミング入門 | Aizu Online Judge

指定した文字列が含まれるかどうか判定する問題

解答1. 入力値を2倍

入力値と同じ内容の文字列を加えます。

inを使用し、文字列に指定した値があるかどうかを調べます。

# coding: utf-8

s = input()
p = input()

if p in (s + s):
    print('Yes')
else:
    print('No')

解答2. 文字列を1字ずつ移動

まず、inを使用し、指定した値があるかどうかを調べます。

値がある場合、Yesを出力し、処理を終了します。
値がない場合、先頭の文字を最後に移動し、またinを使用して値があるかどうかを調べます。

sの長さ分まで繰り返しても値がない場合、Noを出力して処理を終了します。

# coding: utf-8

s = input()
p = input()
flg = False

for i in range(len(s)):
    if p in s:
        flg = True
        break
    s = s[1:] + s[:1]

if flg:
    print('Yes')
else:
    print('No')

文字列sを破壊したくない場合はこちら

# coding: utf-8

s = input()
p = input()
flg = False

for i in range(len(s)):
    if p in s[i:] + s[:i]:
        flg = True
        break

if flg:
    print('Yes')
else:
    print('No')

ITP1_8_C: Counting Characters

文字のカウント | プログラミング入門 | Aizu Online Judge

アルファベットの数を数える問題

解答

まずアルファベットのaからzまでを含んだ文字列を用意します。
入力値は、終了条件が指定されていないため、例外をキャッチしたタイミングで入力値を受け取る処理から抜けます。

アルファベットの数を求めるのには、count()を使用します。
count()は文字列に対して、引数で指定した値がいくつ含まれているのかを返します。

アルファベットをaから順番に1文字ずつ取り出し、入力値にいくつ含まれているかを出力します。

# coding: utf-8

alpha = 'abcdefghijklmnopqrstuvwxyz'
text = ''

while True:
    try:
        text += input().lower()
    except EOFError:
        break

for a in alpha:
    print('{} : {}'.format(a, text.count(a)))

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
行列A, Bの積を求める問題

行列Cの各要素C_{ij}は行列Ai行目の各要素と、行列Bj列目の各要素の積を合計したものです。

行列Bの行列を入れ替えた転置行列{}^t\!Bを用意すれば、行同士の演算で行列Cが求められます。

  1. 行列A, Bを作成し、転置行列{}^t\!Bzip()を使用し求めます。
  2. 次に、for文を使用し、行列Aの行aを取り出します。aに対して、転置行列{}^t\!Bの行bを取り出し、それぞれの要素を掛け合わせたものの合計を求め、結果をリストcに格納します。
  3. 転置行列{}^t\!Bのすべての行bに対して同様の処理をし、cを出力することで、行列Cの1行目を出力したことになります。
  4. これを、行列Aのすべての行aに対して同様の処理をすることで、行列Cを出力します。

解答

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

  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)