AOJ 「ITP I」40問をpythonで解いてみた

本記事では「レッドコーダーが教える、競プロ・AtCoder上達のガイドライン【初級編:競プロを始めよう】」で紹介されているAOJの「Introduction To Programming I」の40問をPythonで解説します。

目次

入門

プログラミングの入門として、基本構造、変数、入出力、計算式を学習します。

ITP1_1_A Hello World

print("Hello world")

ITP1_1_B X:Cubic

x = int(input())
result = x ** 3
print(result)

ITP1_1_C Rectangle

a, b = map(int, input().split())
area = a * b
perimeter = 2 * a + 2 * b

print(area, perimeter)

ITP1_1_D Watch

S = int(input())

h = S // 3600
m = (S % 3600) // 60
s = S % 60

print(f"{h}:{m}:{s}")

条件分岐

条件によって実行する内容を変え、処理の流れを制御する構造文を学習します。

ITP1_2_A Small, Large, or Equal

a, b = map(int, input().split())

if a < b:
    print("a < b")
elif a > b:
    print("a > b")
else:
    print("a == b")

ITP1_2_B Range

a, b, c = map(int, input().split())

if a < b < c:
    print("Yes")
else:
    print("No")

ITP1_2_C Sorting Three Numbers

numbers = list(map(int, input().split()))
sorted_numbers = sorted(numbers)

print(" ".join(map(str, sorted_numbers)))

ITP1_2_D Circle in a Rectangle

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

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

繰り返し処理

条件に従って処理を繰り返し、反復処理を行う構造文を学習します。

ITP1_3_A Print Many Hello World

for _ in range(1000):
    print("Hello World")

ITP1_3_B Print Test Cases

num_lst = []
num = 0

while True:
    num = int(input())
    if num == 0:
        break
    num_lst.append(num)

for i in range(len(num_lst)):
    print('Case {}: {}'.format(i+1, num_lst[i]))

【解説】はこちら

ITP1_3_C Swapping Two Numbers

while True:
    x, y = map(int, input().split())
    if x == 0 and y == 0:
        break
    elif x < y:
        print(x, y)
    else:
        print(y, x)

【解説】はこちら

ITP1_3_D How Many Divisors?

a, b, c = map(int, input().split())
cnt = 0
for i in range(a, b + 1):
    if c % i == 0:
        cnt += 1
print(cnt)

【解説】はこちら

計算

計算式に用いられる様々な演算子を学習します。

ITP1_4_A A/B Problem

a, b = map(int, input().split())

print('{0} {1} {2:.5f}'.format(a//b, a % b, a/b))

【解説】はこちら

ITP1_4_B Circle

import math

r = float(input())
print('{0:.6f} {1:.6f}'.format(r*r*math.pi, 2*r*math.pi))

または

from math import pi

r = float(input())
print('{0:.6f} {1:.6f}'.format(r*r*pi, 2*r*pi))

【解説】はこちら

ITP1_4_C Simple Calculator

while True:
    a, op, b = map(str, input().split())
    a = int(a)
    b = int(b)
    if op == "?":
        break
    elif op == "+":
        print(int(a + b))
    elif op == "-":
        print(int(a - b))
    elif op == "*":
        print(int(a * b))
    elif op == "/":
        print(int(a / b))
    else:
        pass

または

while True:
    table = input().split()
    a = int(table[0])
    op = table[1]
    b = int(table[2])
    if op == "?":
        break
    elif op == "+":
        print(int(a + b))
    elif op == "-":
        print(int(a - b))
    elif op == "*":
        print(int(a * b))
    elif op == "/":
        print(int(a / b))
    else:
        pass

【解説】はこちら

ITP1_4_D Min, Max and Sum

n = int(input())
get_lst = list(map(int, input().split()))
print(min(get_lst), max(get_lst), sum(get_lst))

【解説】はこちら

構造化プログラムI

制御構造や文を組み合わせる構造化プログラミングの基礎を身に付けます。

ITP1_5_A Print a Rectangle

while True:
    H, W = map(int, input().split())
    if H == 0 and W == 0:
        break
    for i in range(H):
        print("#"*W)
    print()

【解説】はこちら

ITP1_5_B Print a Frame

while True:
    H, W = map(int, input().split())
    if H == 0 and W == 0:
        break
    for i in range(H):
        for k in range(W):
            if i == 0 or i == H-1 or k == 0 or k == W-1:
                print("#", end="")
            else:
                print(".", end="")
        print()
    print()

【解説】はこちら

ITP1_5_C Print a Chessboard

while True:

    H, W = map(int, input().split())
    if H == 0 and W == 0:
        break
    for i in range(H):
        for j in range(W):
            if (i+j) % 2 == 0:
                print("#", end="")
            else:
                print(".", end="")
        print()
    print()

【解説】はこちら

ITP1_5_D Structured Programming

n = int(input())
for i in range(1, n+1):
    if i % 3 == 0 or "3" in str(i):
        print(" {}".format(i), end="")
print()

【解説】はこちら

配列

データの列を1つの変数として管理する配列を習得します。

ITP1_6_A Reversing Numbers

n = int(input())
get_lst = list(map(int, input().split()))
get_lst.reverse()
print(*get_lst)

【解説】はこちら

ITP1_6_B Finding Missing Cards

all_cards = [(s, n) for s in ['S', 'H', 'C', 'D'] for n in range(1, 14)]

n = int(input())
hold_cards = []
for _ in range(n):
    suit, num = input().split()
    num = int(num)
    hold_cards.append((suit, num))
for card in all_cards:
    if card not in hold_cards:
        print(*card)

【解説】はこちら

ITP1_6_C Official House

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_D Matrix Vector Multiplication

n, m = map(int, input().split())
A = [list(map(int, input().split())) for _ in range(n)]
b = [int(input()) for _ in range(m)]

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

【解説】はこちら

構造化プログラムII

繰り返し処理や配列を組み合わせることで、構造化プログラミングの理解を深めます。

ITP1_7_A Grading

while True:
    m, f, r = map(int, input().split())
    if m == f == r == -1:
        break

    if m == -1 or f == -1 or m + f < 30:
        print("F")
    elif m + f >= 80:
        print("A")
    elif m + f >= 65:
        print("B")
    elif m + f >= 50:
        print("C")
    elif m + f >= 30:
        if r >= 50:
            print("C")
        else:
            print("D")
    else:
        pass

【解説】はこちら

ITP1_7_B How many ways?

while True:
    n, x = map(int, input().split())
    if n == 0 and x == 0:
        break
    cnt = 0
    for i in range(1, n-1):
        for j in range(i+1, n):
            if j < x - i - j <= n:
                cnt += 1
    print(cnt)

または

while True:
    n, x = map(int, input().split())
    if n == 0 and x == 0:
        break
    cnt = 0
    for i in range(1, n + 1):
        for j in range(i+1, n + 1):
            for k in range(j+1, n + 1):
                if i + j + k == x:
                    cnt += 1
    print(cnt)

【解説】はこちら

ITP1_7_C Spreadsheet

r, c = map(int, input().split())
sheet = [list(map(int, input().split())) for i in range(r)]

for i in range(r):
    sheet[i].append(sum(sheet[i]))

Column_sum = [0]*(c+1)
for j in range(c+1):
    for k in range(r):
        Column_sum[j] += sheet[k][j]

for i in range(r):
    print(*sheet[i])
print(*Column_sum)

【解説】はこちら

ITP1_7_D Matrix Multiplication

n, m, l = map(int, input().split())
A = [list(map(int, input().split())) for _ in range(n)]
B = [list(map(int, input().split())) for _ in range(m)]

for i in range(n):
    C = []
    for j in range(l):
        tmp = 0
        for k in range(m):
            tmp += A[i][k] * B[k][j]
        C.append(tmp)
    print(*C)

【解説】はこちら

文字

プログラムで文字を扱う方法を学習します。

ITP1_8_A Toggling Cases

words = input()
print(words.swapcase())

【解説】はこちら

ITP1_8_B Sum of Numbers

while True:
    str_x = input()
    if str_x == "0":
        break

    ans = 0
    for n in str_x:
        ans += int(n)
    print(ans)

【解説】はこちら

ITP1_8_C Counting Characters

import sys
texts=sys.stdin.read()
texts=texts.lower()
cnt=[0]*26

letters='abcdefghijklmnopqrstuvwxyz'
for x in texts:
    i=0
    for y in letters:
        if x==y:
            cnt[i]+=1
        i+=1
for i in range(26):
    print(letters[i]+" : "+str(cnt[i]))

【解説】はこちら

ITP1_8_D Ring

s = input()
p = input()
s = s * 2
if s.find(p) != -1:
    print('Yes')
else:
    print('No')

【解説】はこちら

文字列

文字列処理の基礎を学習します。

ITP1_9_A Finding a Word

word = input()
cnt = 0
while True:
    sentence = input()
    if sentence == "END_OF_TEXT":
        break
    else:
        cnt += sentence.lower().split().count(word)
print(cnt)

【解説】は

ITP1_9_B Shuffle

while True:
    cards = input()
    if cards == "-":
        break
    m = int(input())
    for _ in range(m):
        sh = int(input())
        former = cards[:sh]
        later = cards[sh:]
        cards = later+former
    print(cards)

【解説】はこちら

ITP1_9_C Card Game

n = int(input())
T = 0
H = 0
for i in range(n):
    card_t, card_h = input().split()
    if card_t == card_h:
        T += 1
        H += 1
    else:
        if card_h > card_t:
            H += 3
        else:
            T += 3
print(T, H)

【解説】はこちら

ITP1_9_D Transformation

text = input()
q = int(input())
for _ in range(q):
    order = input().split()
    a, b = map(int, order[1:3])
    if order[0] == "print":
        print(text[a:b+1])
    elif order[0] == "reverse":
        re_text = text[a:b+1]
        text = text[:a]+re_text[::-1]+text[b+1:]
    else:
        text = text[:a]+order[3]+text[b+1:]

【解説】はこちら

数学関数

基礎的な数学関数を学習します。

ITP1_10_A Distance

import math
x1, y1, x2, y2 = map(float, input().split())
print(math.hypot(x2 - x1, y2 - y1))

【解説】はこちら

ITP1_10_B Triangle

import math
a, b, C = map(int, input().split())
rad = math.radians(C)
S = 0.5*a*b*math.sin(rad)
h = 2*S/a
c = math.sqrt(a**2+b**2-2*a*b*math.cos(rad))
L = a+b+c
print(S, L, h, sep="\n")

【解説】はこちら

ITP1_10_C Standard Deviation

while True:
    n = int(input())
    if n == 0:
        break
    score = list(map(int, input().split()))
    mean = sum(score)/n
    var_sum = 0
    for i in range(n):
        var_sum += (score[i]-mean)**2
    print((var_sum/n)**0.5)

【解説】はこちら

ITP1_10_D Distance II

n = int(input())
X = list(map(int, input().split()))
Y = list(map(int, input().split()))
# p=1,2,3
for p in range(1, 4):
    print("{0:.6f}".format(sum([abs(a-b)**p for a, b in zip(X, Y)])**(1/p)))
# p=infinity
print("{0:.6f}".format(max([abs(a-b) for a, b in zip(X, Y)])))

【解説】はこちら

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

雇われのシステムエンジニアです。
普段は車載ECUのセキュリティー分野に従事しております。

■保有資格
Salesforce 認定 Platform アプリケーションビルダー
Salesforce 認定 Platform デベロッパー

コメント

コメントする

目次