AtCoder Programming Guide for beginners(APG4b) 第1章のEX問題をPythonで解く

AtCoder Programming Guide for beginners(APG4b) EX1 ~ EX15の回答

~ AtCoder 300台の貧弱プログラマ脳筋コードでとくAPG4b

概要

  • AtCoder rate 300台の貧弱プログラマがAPG4bのEX1 ~ 15(第1章)の内容をPythonで解いていくだけ
    前回後輩に頼まれて第2章から解いていったが、どうせなら第1章も解こうじゃないかというただの自己満
    今回もさっさと解いていく

EX1 ~ コードテストと出力の練習 ~

この問題を解いていく

print("こんにちは")
print("AtCoder")

EX1の補足

まぁこれはprintで指定された文字列を出力するだけなので補足事項はなし

EX2 ~ エラーの修正

この問題を解いていく
※今回はエラーの修正ということで、問題のコードも載せるが、Pythonでは再現不可のコードがあったため、別のコードで代用した
問題のコード(Python仕様に変更後)

print("いつも2525)
print(”AtCoderくん")

エラーコード

  File "Main.py", line 1
    print("いつも2525)
          ^
SyntaxError: unterminated string literal (detected at line 1)
File "Main.py", line 2
    print(”AtCoderくん")
          ^
SyntaxError: invalid character '”' (U+201D)

解答

print("いつも2525")
print("AtCoderくん")

EX2の補足

Pythonインタプリタ(1行ずつエラーを確認する)なので、最初の文でエラーが出るとそれ以降の行は正しい処理をしているのかはわからないため注意が必要(今回は分かりやすくするため全てのエラーを列挙した)
今回のエラー内容として、1行目は"で閉じていないことが原因であり、2行目は"が全角になっていたことが原因である

EX3 ~ 計算問題 ~

この問題を解いていく

print(100 * (100 + 1) // 2)

EX3の補足

最初、

print(100 * (100 + 1) / 2)

としたが、WAが出た
この原因として、pythonは割り算を行うと割り切れたとしてもintではなく、floatで返す(ex 100 / 2 => 50.0)ことが挙げられる
そのため、intにキャスト(ex int(100 / 2))にするか、//を使って整数にすることでこの問題を解決できる

EX4 ~ ⚪︎年は何秒? ~

この問題を解いていく

year_second = 365 * 24 * 60 * 60

# 1年の秒数
print(year_second * 1)
# 2年の秒数
print(year_second * 2)
# 5年の秒数
print(year_second * 5)
# 10年の秒数
print(year_second * 10)

EX4の補足

今回の問題は1年の秒数を変数に格納しておいて、必要な年数分をかけたものを出力すればいいだけなので補足することはないだろう

EX5 ~ A足すB問題 ~

この問題を解いていく

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

EX5の補足

a + bを行うコードはもっと短く書くことができる

print(sum(map(int, input().split()))

EX6 ~ 電卓をつくろう ~

この問題を解いていく

f = list(input().split())

a, b = int(f[0]), int(f[2])
op = f[1]

if op == '+':
  print(a + b)
elif op == '-':
  print(a - b)
elif op == '*':
  print(a * b)
elif op == '/':
  if b == 0:
    print("error")
  else:
    print(a // b)
else:
  print("error")

EX6の補足

今回の問題はif文をそれぞれの条件に合わせて分岐させるだけなので補足することはないだろう

EX7 ~ bool値パズル ~

この問題を解いていく

a = True
b = False
c = True

if a:
  print("At", end='')
else:
  print("Yo", end='')

if not a and b:
  print("Bo", end='')
elif not b or c:
  print("Co", end='')

if a and b and c:
  print("foo!", end='')
elif True and False:
  print("yeah!", end='')
elif not a or c:
  print("der", end='')
  
print()

EX7の補足

論理積(and)と論理和(or)の仕組みを覚えておくと良い
and -> どちらもTrueの場合のみTrueを返す
or -> どちらか片方がTrueの場合Trueを返す

EX8 ~ たこ焼きセット ~

この問題を解いていく

pattern = int(input())

if pattern == 2:
  text = input()
  print(text + "!")

price = int(input())
count = int(input())

print(price * count)

EX8の補足

この問題はpatternが2の時だけ、テキストを入力して出力する動作が追加されるため、if文で分岐させ、テキストを受け取り、出力してから、値段と個数を受け取り、合計金額を出力している

EX9 ~複合代入演算子を使おう ~

この問題を解いていく

x, a, b = map(int, input().split())
# 出力1. xに1を足した値
x += 1
print(x)

# 出力2. (1.で出力した値)に(a+b)を掛けた値
x *= (a + b)
print(x)

# 出力3. (2.で出力した値)に(2.で出力した値)を掛けた値
x *= x
print(x)

# 出力4. (3.で出力した値)から1を引いた値
x -= 1
print(x)

EX9の補足

出力1で x += 1と書いているが、x = x + 1と同じ挙動を示す
同じ変数に演算を行う場合は、x += 1x *= 2 などx 演算子= 何らかの値 を使うことで、x = x 演算子 何らかの値を省略することができる

EX10 ~ 棒グラフの出力 ~

この問題を解いていく

a, b = map(int, input().split())
A = "A:" + "]" * a
B = "B:" + "]" * b

print(A)
print(B)

EX10の補足

文字列は演算子を使うことで文字列同士を繋げることができる
例えば、定義 : A = ""A += "AtCoder" を行うとAの中身は"AtCoder"となる 掛け算を使う場合 -> 定義 : A = "AtCoder"A *= 2を行うとAの中身は"AtCoderAtCoder"となる

EX11 ~ 電卓を作ろう2 ~

この問題を解いていく

N = int(input())
A = int(input())

for i in range(N):
  op, B = input().split()
  B = int(B)
  
  if op == '+':
    A += B
    print(f"{i+1}:{A}")
  elif op == '-':
    A -= B
    print(f"{i+1}:{A}")
  elif op == '*':
    A *= B
    print(f"{i+1}:{A}")
  elif op == '/':
    if B == 0:
      print("error")
      exit()
    else:
      A = int(A / B)
      print(f"{i+1}:{A}")

EX11の補足

Python文字列と整数型を一緒に出力することができないので、整数型の変数を文字列型に変換する必要がある
それを回避するために、formatを使い、整数型を文字列型に変換せずに出力させている
print文のところで使われているfだが、これはformatを使っている

formatの詳しい使い方はPython, formatで書式変換(0埋め、指数表記、16進数など)を参考にすると良いだろう

EX12 ~ 足したり引いたり ~

この問題を解いていく

S = list(input())
N = 1
plus = S.count('+')
minus = S.count('-')
print(N + plus - minus)

EX12の補足

リスト、文字列には特定の文字の出現回数を数える.count()というメソッドがある そのため、今回書いたコードは

S = input()
N = 1
plus = S.count('+')
minus = S.count('-')
print(N + plus - minus)

と書いてもACを取ることができる

EX13 ~ 平均との差 ~

この問題を解いていく

N = int(input())
A = list(map(int, input().split()))
mean = sum(A) // N
ans = list(map(lambda x: abs(mean - x), A))
print(*ans, sep='\n')

EX13の補足

print()の第2引数で指定されているsep='\n'は区切り文字(デフォルトは,)を'\n'(改行文字)として扱ってほしいとプログラムに指定してるのである なので、リストA = [1, 2, 3]があるとしたら、sep='\n'は、A = [1'\n'2'\n'3'\n']となっている
また、リストの前に*がついているが、これはリストを1つ1つ渡す作業を一括で行ってくれる機能になっている
なので、リストA = [1, 2, 3]があるとしたら、*Aは、1 2 3となっている これら2つを組み合わせることで、for文を使わずに計算結果を1行ごとに出力することができる
※今回のリストを半角空白ごとに出力する(1 2 3のような出力結果にしたい)場合は、sepのところを削除すると良い

EX14 ~ 三人兄弟の身長差 ~

この問題を解いていく

A, B, C = map(int, input().split())
minimum = min(A, B, C)
maximum = max(A, B, C)
print(maximum - minimum)

EX14の補足

Pythonには元々最大値・最小値を求める関数があるので、それを使うことで今回の問題は簡単に解くことができる
max(): ()内に指定された変数・リストの中の最大値を返してくれる
min(): ()内に指定された変数・リストの中の最小値を返してくれる

EX15 ~ 三人兄弟へのプレゼント ~

この問題を解いていく

N = int(input())
A = sum(list(map(int, input().split())))
B = sum(list(map(int, input().split())))
C = sum(list(map(int, input().split())))

print(A * B * C)

EX15の補足

Pythonには元々合計を求める関数があるので、それを使うことで今回の問題は簡単に解くことができる
sum(): ()内に指定された変数・リストの合計を返してくれる