📚

【Pythonで解く】AIZU ONLINE JUDGEのプログラミング入門(ITP1)

2022/12/28に公開
はじめに

10月にITパスポート,Python3基礎認定試験と連続で合格したので,次はアルゴリズムとデータ構造について学びPython3で実装できるようになりたいと考え,11月頃から少しずつ着手を開始していました.
最初は有名な書籍「プログラミングコンテスト攻略のためのアルゴリズムとデータ構造(マイナビ)」を解き進めようと思いました.しかし当初の自分にとっては難易度がまだほんの少し高く感じました.
冒頭の「準備編」ではオンラインジャッジについて記載があったため,まずは入門レベルから着手した方がいいと考え本講座に取り組むことに決めました.

記事の内容

本記事では,AIZU ONLINE JUDGEのプログラミング入門をPythonでコーディングしacceptされた答えのみを記載しています.
当初は,自身が書いたコードがacceptされた後は,念のためメモに保存しておく程度でしたが,最近Zennを始めたこともありせっかくなので記事にして残すことにしました.
上記の通りメモに残しておいたコードのみを載せているため,書く設問での思考手順や,補足的なノートも今のところ記載はしていません.
今後,自身の中での復習を兼ねて本記事をアップデートする可能性はゼロではありませんが,今のところ現状の記載で十分かと思っています.

自身のレベル感

現在営業職であり普段から仕事でプログラミングを使うことは全くありません.大学院時代は非情報系でしたが,研究活動の中で数値計算を行うためにPythonを少し触っていました.社会人になってからはほぼ忘れてしまったと感じたため,Progateをイチからやり直したり,Pythonの基礎試験を受けたりしていました.
ですので,レベル感は初心者〜初級者の程度だと思います.
この記事を通して,同じようなレベルの方に少しでも役に立てればと思います.

トピック#1 入門

1_A:Hello World

ITP1_1_A 解答
print("Hello World")

1_B:xの3乗

ITP1_1_B 解答
x = int(input())
print(x**3)

1_C:長方形の面積と周の長さ

ITP1_1_C 解答
a, b = map(int, input().split())
print(a * b, a * 2 + b * 2)

1_D:時計

ITP1_1_D 解答
s = int(input())
h = s // 3600
m = s % 3600 // 60
s = s % 60
print(f"{h}:{m}:{s}")

トピック#2 条件分岐

2_A:大小関係

ITP1_2_A 解答
a, b = map(int, input().split())
if a < b:
    print('a < b')
elif a > b:
    print('a > b')
else:
    print('a == b')

2_B:範囲

ITP1_2_B 解答
a, b, c = map(int, input().split())
if a<b and b<c:
    print('Yes')
else:
    print('No')

2_C:3つの数の整列

ITP1_2_C 解答
a, b, c = map(int, input().split())
if a <= b <= c :
    print(a, b, c)
elif a <= c <= b:
    print(a, c, b)
elif b <= a <= c:
    print(b, a, c)
elif b <= c <= a:
    print(b, c, a)
elif c <= a <= b:
    print(c, a, b)
else:
    print(c, b, a)

2_D:長方形の中の円

ITP1_2_D 解答
W, H, x, y, r = map(int, input().split())

if x >= r and x <= (W-r) and y >= r and y <= (H-r):
    print('Yes')
else:
    print('No')

トピック#3 繰り返し処理

3_A:複数のHello Worldの出力

ITP1_3_A 解答
for _ in range(1000):
    print('Hello World')

3_B:テストケースの出力

ITP1_3_B 解答
i = 1
while True:
    x = int(input())
    if x == 0: break
    print(f'Case {i}: {x}')
    i += 1

3_C:2つの値の交換

ITP1_3_C 解答
while True:
    x, y = map(int, input().split())
    if x == 0 and y == 0:
        break
    if x <= y:
        print(x, y)
    else:
        print(y, x)
ITP1_3_C 解答(約数の数:while文で記述した場合)
a, b, c = map(int, input().split())
count = 0
while a <= b:
    if (c % a) == 0:
        count += 1
        a += 1
    else:
        a += 1
print(count)
ITP1_3_C 解答(約数の数:for文で記述した場合)
a, b, c = map(int, input().split())
count = 0
for i in range(a, b+1):
    if c % i == 0:
        count += 1
print(count)

3_D:

ITP1_3_D 解答

トピック#4 計算

4_A:割り算

ITP1_4_A 解答
a, b = map(int, input().split())
d = a // b
r = a % b
f = a / b
# print(f'{d}, {r}, {f:.5f}')
print('{0} {1} {2:.5f}'.format(d, r, f))

4_B:円の面積と円周

ITP1_4_B 解答
r = float(input())
pi = 3.141592653589
area = pi * r ** 2
cir = 2 * pi * r
print('{0:.5f} {1:.5f}'.format(area, cir))

4_C:計算機

ITP1_4_C 解答
while True:
    a, op, b = input().split()
    a = int(a)
    b = int(b)

    if op == '+':
        print(a + b)
    elif op == '-':
        print(a - b)
    elif op == '*':
        print(a * b)
    elif op == '/':
        print(a // b)
    elif op == '?':
        break

4_D:最小値,最大値,合計値

ITP1_4_D 解答
n = int(input())
a = list(int(x) for x in input().split())
maximum = max(a)
minimum = min(a)
summation = sum(a)
print(minimum, maximum, summation)

トピック#5 構造化プログラムⅠ

5_A:長方形の描画

ITP1_5_A 解答
while True:
    H, W = map(int, input().split())
    if H == 0 and W == 0:
        break
    else:
        for x in range(H):
            # print('#' * W)
            for y in range(W):
                print('#', end='')
            print()
        print()

5_B:フレームの描画

ITP1_5_B 解答
while True:
    H, W = map(int, input().split())
    if H == 0 and W == 0:
        break
    else:
        for i in range(H):
            if i == 0 or i == H-1:
                for j in range(W):
                    print('#', end='')
                print()
            else:
                for j in range(W):
                    if j == 0:
                        print('#', end='')
                    elif j > 0 and j < W-1:
                        print('.', end='')
                    elif j == W-1:
                        print('#', end='')
                print()
        print()

5_C:チェスボードの描画

ITP1_5_C 解答
while True:
    H, W = map(int, input().split())

    if H == 0 and W == 0:
        break

    for y in range(H):
        if y % 2 == 0:
            if W % 2 == 0:
                print('#.' * (W // 2), end='')
            else:
                print('#.' * (W // 2) + '#', end='')
            print()
        else:
            if W % 2 == 0:
                print('.#' * (W // 2), end='')
            else:
                print('.#' * (W // 2) + '.', end='')
            print()
    print()

5_D:構造化プログラミング

この設問はいったんあまり気にせず進んでよいかと思います.
一応答えは載せておきます.

ITP1_5_D 解答
n = int(input())
for i in range(1, n+1):
    if i % 3 == 0:
        print(f' {i}', end='')
    elif '3' in str(i):
        print(f' {i}', end='')

トピック#6 配列

6_A:数列の反転

ITP1_6_A 解答
n = int(input())
ai = list(int(x) for x in input().split())
ai.reverse()

for k, elem in enumerate(ai):
    if k > 0:
        print(' ', end = '')
    print(elem, end = '')
print()

6_B:不足しているカードの発見

ITP1_6_B 解答
cards = [[False for i in range(13)] for j in range(4)]
patterns = ['S', 'H', 'C', 'D']

n = int(input())
for _ in range(n):
    pattern, number = [str(x) for x in input().split()]
    cards[patterns.index(pattern)][int(number)-1] = True

for i in range(4):
    for j in range(13):
        if cards[i][j] == False:
            print(patterns[i], j+1)

6_C:公舎の入居者数

ITP1_6_C 解答
residents = [[[0 for _ in range(10)] for _ in range(3)] for _ in range(4)]

n = int(input())
for _ in range(n):
    building, floor, resident, v = [int(x) for x in input().split()]
    residents[building-1][floor-1][resident-1] += v

for index1, building in enumerate(residents):
    for index2, floor in enumerate(building):
        for index3, resident in enumerate(floor):
            print('', f'{residents[index1][index2][index3]}', end='')
        print()
    if index1 != 3:
        print('#'*20)

6_D:ベクトルと行列の積

ITP1_6_D 解答
n, m = (int(x) for x in input().split())
A = [[int(x) for x in input().split()] for _ in range(n)]
b = [int(input()) for _ in range(m)]

for i in range(n):
    answer = 0
    for j in range(m):
        answer += A[i][j] * b[j]
    print(answer)

トピック#7 構造化プログラミングⅡ

7_A:成績

ITP1_7_A 解答
i = 0
while i < 50:
    m, f, r = map(int, input().split())
    if m == f == r == -1:
        break
    if m == -1 or f == -1:
        print('F')
    elif m + f >= 80:
        print('A')
    elif 65 <= m + f < 80:
        print('B')
    elif 50 <= m + f < 65:
        print('C')
    elif 30 <= m + f < 50:
        if r >= 50:
            print('C')
        else:
            print('D')
    elif m + f < 30:
        print('F')
    i += 1

7_B:組み合わせの数

ITP1_7_B 解答
while True:
    n, x = map(int, input().split())
    if n == x == 0:
        break

    ans = 0
    for j in range(1, n+1):
        for k in range(j+1, n+1):
            for l in range(k+1, n+1):
                    if (j+k+l) == x:
                        ans += 1
    print(ans)

7_C:表計算

ITP1_7_C 解答
r, c = [int(x) for x in input().split()]
box = [[int(x) for x in input().split()] for y in range(r)]

# 行の総和を計算する
for row in box:
    row.append(sum(row))

# 列の総和を入れるリストを作成
column_sum = [0] * (c+1)
for i in range(r):
    for j in range(c+1):
        column_sum[j] += box[i][j]

# 元の行列に列の総和を入れたリストを追加
box.append(column_sum)
for row in box:
    print(*row)

7_D:行列の積

ITP1_7_D 解答
n, m, l = [int(x) for x in input().split()]
a = [[int(x) for x in input().split()] for y in range(n)]
b = [[int(x) for x in input().split()] for y in range(m)]
c = [[int(0) for x in range(l)] for y in range(n)]

for j in range(n):
    for k in range(m):
        for i in range(l):
            c[j][i] += a[j][k] * b[k][i]
    print(*c[j])

トピック#8 文字

8_A:大文字と小文字の入れ替え

ITP1_8_A 解答
words = str(input())
for num1, ch in enumerate(words):
    if ch.isalpha():
        if ch.islower():
            print(ch.upper(), end='')
        elif ch.isupper():
            print(ch.lower(), end='')
    else:
        print(ch, end='')
print()

8_B:数字の和

ITP1_8_B 解答
while True:
    num = int(input())
    if num == 0:
        break

    num_string = str(num)
    sum = 0
    for digit in num_string:
        sum += int(digit)
    print(sum)

8_C:文字のカウント

ITP1_8_C 解答
counter = [0]*128
while True:
    try:
        S = str(input()).lower()
    except:
        break
    for ch in S:
        counter[ord(ch)] += 1
for i in range(ord('a'), ord('z')+1):
    print(f'{chr(i)} : {counter[i]}')

8_D:リング

ITP1_8_D 解答
while True:
    s = str(input()).lower()
    p = str(input()).lower()
    length = len(s)
    max_times = (100 // length) + 1
    ring = s * max_times

    if p in ring:
        print('Yes')
        break
    elif p not in ring:
        print('No')
        break

トピック#9 文字列

9_A:単語の検索

ITP1_9_A 解答
W = str(input()).lower()
counts = 0
while True:
    T = str(input())
    if T == 'END_OF_TEXT':
        break
    else:
        for word in T.lower().split():
            if word == W:
                counts += 1

print(counts)

9_B:シャッフル

ITP1_9_B 解答
while True:
    cards = str(input())
    if cards == '-':
        break

    m = int(input())
    h = [0] * m
    for i in range(m):
        h[i] = int(input())

    for j in range(m):
        cards = cards[h[j]:len(cards)] + cards[0:h[j]]
    print(cards)

9_C:カードゲーム

ITP1_9_C 解答
n = int(input())
T_point = 0
H_point = 0

for i in range(n):
    Taro, Hanako = map(str, input().split())

    if Taro > Hanako:
        T_point += 3
    elif Taro < Hanako:
        H_point += 3
    else:
        T_point += 1
        H_point += 1

print(T_point, H_point)

9_D:文字列変換

ITP1_9_D 解答
str = str(input()).lower()
q = int(input())

for _ in range(q):
    Input = input().split()
    order = Input[0]
    a = int(Input[1])
    b = int(Input[2])

    if order == 'print':
        print(str[a:b+1])
    elif order == 'reverse':
        str = str[:a] + ''.join(list(reversed(str[a:b+1]))) + str[b+1:]
    elif order == 'replace':
        str = str[:a] + Input[3] + str[b+1:]

トピック#10 数学関数

10_A:距離

ITP1_10_A 解答
import math
x1, y1, x2, y2 = map(float, input().split())
l = math.sqrt((x2 - x1)**2 + (y2 - y1)**2)
print(l)

10_B:三角形

ITP1_10_B 解答
import math
a, b, C = [float(x) for x in input().split()]
C_radian = math.radians(C)

S = 1/2 * a * b * math.sin(C_radian)
print(S)

c = math.sqrt(a**2 + b**2 - (2*a*b*math.cos(C_radian)))
L = a + b + c
print(L)

h = 2 * S / a
print(h)

10_C:標準偏差

ITP1_10_C 解答
import math
while True:
    n = int(input())
    if n == 0:
        break

    s = [int(x) for x in input().split()]
    m = sum(s) / len(s)
    S = 0
    for i in range(n):
        S = S + (s[i]-m)**2

    a = math.sqrt(S / n)
    print(a)

10_D:ミンコフスキー距離

ITP1_10_D 解答
n = int(input())
x = [float(i) for i in input().split()]
y = [float(j) for j in input().split()]

l_p1 = 0
l_p2 = 0
l_p3 = 0
l_pm = 0
xy_list = []

for i in range(n):
    l_p1 = l_p1 + abs(x[i]-y[i])
    l_p2 = l_p2 + abs(x[i]-y[i])**2
    l_p3 = l_p3 + abs(x[i]-y[i])**3
    xy_list.append(abs(x[i]-y[i]))
    l_pm = max(xy_list)

print(l_p1)
l_p2 = l_p2 ** (1/2)
print(l_p2)
l_p3 = l_p3 ** (1/3)
print(l_p3)
print(l_pm)
誤りを発見した場合

最後まで読んでくださりありがとうございます.
もし本文に間違えなどある場合は,是非教えて頂けるとありがたいです.
お手数ですがこちらの記事にコメントを頂ければ,修正いたします.

今後にむけて

今回「AIZU ONLINE JUDGEのプログラミング入門(ITP1)」を自力で一通り解き終わりました.
次は「プログラミングコンテスト攻略のためのアルゴリズムとデータ構造(マイナビ)」,通称「螺旋本」を解き進めていきます.
そちらの問題も引き続きPythonで解いていくので,またZennで記事投稿をしていきたいです.

また,今回AOJの基礎問題を解き進める中で自身がまだ得意になり切れていない部分も明らかになりました.
標準入力の実装におけるinput関数の使い分けや,お題に沿った出力形式の実装,さらにいうと螺旋本に取り組む前に個別で検索学習したポインタや構造体についても.自身の理解定着のためにそのうち記事にしていければなと考えています.

この冬休み中(有給も使って18連休を錬成)に自身に課している課題「螺旋本」を1冊完遂することなので,まずは最優先で進めていきます.
その後はLeetCodeなどで競技プログラミングの問題を解きつつ,4月からの転職に向けた新たな言語の基礎学習(Javaらしい)も進めていきます.

引き続き頑張りましょう!

Discussion