【Pythonで解く】AIZU ONLINE JUDGEのプログラミング入門(ITP1)
はじめに
10月にITパスポート,Python3基礎認定試験と連続で合格したので,次はアルゴリズムとデータ構造について学びPython3で実装できるようになりたいと考え,11月頃から少しずつ着手を開始していました.
最初は有名な書籍「プログラミングコンテスト攻略のためのアルゴリズムとデータ構造(マイナビ)」を解き進めようと思いました.しかし当初の自分にとっては難易度がまだほんの少し高く感じました.
冒頭の「準備編」ではオンラインジャッジについて記載があったため,まずは入門レベルから着手した方がいいと考え本講座に取り組むことに決めました.
記事の内容
本記事では,AIZU ONLINE JUDGEのプログラミング入門をPythonでコーディングしacceptされた答えのみを記載しています.
当初は,自身が書いたコードがacceptされた後は,念のためメモに保存しておく程度でしたが,最近Zennを始めたこともありせっかくなので記事にして残すことにしました.
上記の通りメモに残しておいたコードのみを載せているため,書く設問での思考手順や,補足的なノートも今のところ記載はしていません.
今後,自身の中での復習を兼ねて本記事をアップデートする可能性はゼロではありませんが,今のところ現状の記載で十分かと思っています.
自身のレベル感
現在営業職であり普段から仕事でプログラミングを使うことは全くありません.大学院時代は非情報系でしたが,研究活動の中で数値計算を行うためにPythonを少し触っていました.社会人になってからはほぼ忘れてしまったと感じたため,Progateをイチからやり直したり,Pythonの基礎試験を受けたりしていました.
ですので,レベル感は初心者〜初級者の程度だと思います.
この記事を通して,同じようなレベルの方に少しでも役に立てればと思います.
トピック#1 入門
1_A:Hello World
print("Hello World")
1_B:xの3乗
x = int(input())
print(x**3)
1_C:長方形の面積と周の長さ
a, b = map(int, input().split())
print(a * b, a * 2 + b * 2)
1_D:時計
s = int(input())
h = s // 3600
m = s % 3600 // 60
s = s % 60
print(f"{h}:{m}:{s}")
トピック#2 条件分岐
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:範囲
a, b, c = map(int, input().split())
if a<b and b<c:
print('Yes')
else:
print('No')
2_C:3つの数の整列
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:長方形の中の円
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の出力
for _ in range(1000):
print('Hello World')
3_B:テストケースの出力
i = 1
while True:
x = int(input())
if x == 0: break
print(f'Case {i}: {x}')
i += 1
3_C:2つの値の交換
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)
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)
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:
トピック#4 計算
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:円の面積と円周
r = float(input())
pi = 3.141592653589
area = pi * r ** 2
cir = 2 * pi * r
print('{0:.5f} {1:.5f}'.format(area, cir))
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:最小値,最大値,合計値
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:長方形の描画
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:フレームの描画
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:チェスボードの描画
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:構造化プログラミング
この設問はいったんあまり気にせず進んでよいかと思います.
一応答えは載せておきます.
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:数列の反転
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:不足しているカードの発見
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:公舎の入居者数
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:ベクトルと行列の積
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:成績
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:組み合わせの数
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:表計算
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:行列の積
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:大文字と小文字の入れ替え
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:数字の和
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:文字のカウント
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:リング
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:単語の検索
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:シャッフル
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:カードゲーム
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:文字列変換
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:距離
import math
x1, y1, x2, y2 = map(float, input().split())
l = math.sqrt((x2 - x1)**2 + (y2 - y1)**2)
print(l)
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:標準偏差
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:ミンコフスキー距離
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