【AtCoder】ABC315 – A,B問題について解説【Python】

abc315-ab プログラミング

A – tcdr

問題へのリンク

a e i o u 以外の文字を出力します。

入力例1
atcoder

入力例1の「atcoder」には a e o が含まれているのでその文字を取り除いた「tcdr」を出力します。

S について1文字ずつ見ていき、その文字が a e i o u 以外のとき、答え用の変数に追加していきます。

1文字ずつ見ていくには for 文を使います。

S = 'abcde'

# len() で文字列の長さを取得してループ
for i in range(len(S)):
    print(S[i])

# 文字列について直接ループ
for c in S:
    print(c)


""" いずれの出力結果も次の通り
a
b
c
d
e
"""

その1文字について if 文で a e i o u だったときは、答え用の変数に追加する処理をスキップしています

S = input()

answer = ''
for c in S:
    # a e i o u のいずれかだったときはスキップ
    if c == 'a':
       continue
    if c == 'e':
       continue
    if c == 'i':
        continue
    if c == 'o':
        continue
    if c == 'u':
        continue

    # 答え用の変数に追加
    answer += c

print(answer)

論理演算子の or を使うことで、if 分を1行にまとめることもできます。

S = input()

answer = ''
for c in S:
	  # a e i o u のいずれかだったときはスキップ
	  if c == 'a' or c == 'e' or c == 'i' or c == 'o' or c == 'u':
		    continue
	
    # 答え用の変数に追加
	  answer += c

print(answer)

in 演算子を使ったコード

in 演算子を使うことで 簡単にチェックすることもできます。

x in y のように使い、x が y の部分文字列であるときに True を返します。

S = input()

answer = ''
for c in S:
	  # a e i o u のいずれかだったときはスキップ
	  if c in 'aeiou':
		    continue
	
    # 答え用の変数に追加
	  answer += c

print(answer)

in 演算子は、リストで使うこともできます。

S = input()

answer = ''
for c in S:
	  # a e i o u のいずれかだったときはスキップ
	  if c in ['a', 'e', 'i', 'o', 'u']:
		    continue
	
    # 答え用の変数に追加
	  answer += c

print(answer)

replace() を使ったコード

replace() を使って文字を置換することもできます。

replace(old, new) のように使い、old を new に置き換えます。

a e i o u の文字をそれぞれ、” に置き換えることで、取り除いています。

S = input()

S = S.replace('a', '')
S = S.replace('e', '')
S = S.replace('i', '')
S = S.replace('o', '')
S = S.replace('u', '')

print(S)

メソッドチェーンを使って、次のように書くこともできます。

S = input()

print(S.replace('a','').replace('e','').replace('i','').replace('o','').replace('u',''))

B – The Middle Day 

問題へのリンク

入力例1
12
31 28 31 30 31 30 31 31 30 31 30 31

入力例1だと、各月の日数は次のようになり、1年間の日数は365日になります。

  • 1月:31日
  • 2月:28日
  • 3月:31日
  • 4月:30日
  • 5月:31日
  • 6月:30日
  • 7月:31日
  • 8月:31日
  • 9月:30日
  • 10月:31日
  • 11月:30日
  • 12月:31日

問題文から、一年の真ん中の日は D を合計したものに1を足し、2で割った日目になります。

入力例1では(31+28+31+30+31+30+31+31+30+31+30+31+1)/ 2 = 183日目です。

1年の日数は次のように for 文でループすることで求めることができます。

M = int(input())
D = list(map(int, input().split()))

# 1年の日数
total_days = 0
for d in D:
    total_days += d

print(total_days)  # 入力例1だと 365 が出力される

sum() を使うことで求めることもできます。

M = int(input())
D = list(map(int, input().split()))

# 1年の日数
total_days = sum(D)

print(total_days)  # 入力例1だと 365 が出力される

あとは、その日数になるまでループしていくことで答えが求まります。

M = int(input())
D = list(map(int, input().split()))

mid_day = (sum(D)+1) // 2
now = 0

for month in range(M):
	  for day in range(D[month]):
		    now += 1
		    if now >= mid_day:
			      print(month+1, day+1)
			      exit()
タイトルとURLをコピーしました