ABC202の解説。
A - Three Dice
解説
3つのサイコロを投げて、出た目と反対の面が表す整数を足し合わせた値を求めるもの。
そもそもサイコロは、表と裏を足して7になるようにできている。つまり、1の裏は6、2の裏は5、3の裏は4となっている。
したがって、出た目をa, b, c
とすると、それぞれの裏の値は、7-a, 7-b, 7-c
となる。これらを足し合わせたものが答えなので、(7-a)+(7-b)+(7-c)=21-(a+b+c)
となる。
つまり、次のようなコードとなる。
コード
a, b, c = map(int, input().split())
print(21 - (a + b + c))
B - 180°
解説
問題としては、S
を180度回転したものを出力するというもの。
文字列は、0, 1, 6, 8, 9
なので、反転すべきものは、6, 9
のみ。
test
に値を代入して、6, 9
ならば、9, 6
に入れ替える。それ以外の値はそのまま新しいリストに追加する。
あとは、そのリストをそのまま反転させるだけ。
最後は、''.join()
でリストの値を連結する。
コード
S = str(input())
l = []
for s in S:
test = s
if test == '6':
test = '9'
elif test == '9':
test = '6'
l.append(test)
print(''.join(reversed(l)))
C - Made Up
解説
A_i = B_(C_j)
となる(i, j)
の総数を出力するもの。
となっているが、単なる数え上げ問題。
まず、A
に何の数字が何個あるのかを辞書にする。その際にはCounter()
を用いる。
例えば、A = [1, 2, 2]
ならば、Counter({1: 1, 2: 2})
となり、1
が1つ、2
が2つであることがわかる。
次に、これをB
と参照していく。B
の値を辞書で参照して、順番に値を探していく。
例えば、入力値が3
であれば、先程の辞書には値がないため、新しいリストl
に0
が追加(append)される。入力値が1
であれば、個数(value
)として1
が取りだされ、リストl
に1
が追加される。同様に入力値2
で、リストに2
が追加される。
最後にC
を見ていく。これは少しわかりにくいので、先に例を出す。例えば、入力値が2
であれば、A_i = B_2
となるような値を探しに行くことになる。ここでいうB_2
の値は、2番目に入れた1
の値である。つまり、1
がA
にいくつあるのか、これは先ほど作成したリストl
で確認できる。
今回B
では、2番目だが、Pythonのリストのindexは0
から始まるので、indexは1
である。つまり、l[i-1]
の値を参照することで求められる。
これらをC
の入力値それぞれで検証し、ans
に足していくことで答えが出力される。
コード
# O(n)
from collections import Counter
N = int(input())
ans = 0
A = list(map(int, input().split()))
# それぞれの数字が何個あるかの辞書
tmp = Counter(A)
l = []
# 入力した値がAの辞書にいくつあるのか確認
for i in map(int, input().split()):
l.append(tmp[i])
# jは1から始まるので、[i-1]の値を参照
for i in map(int, input().split()):
ans += l[i-1]
print(ans)
おまけコード(TLE)
# O(n^2)
from collections import Counter
N = int(input())
A = list(map(int, input().split()))
B = list(map(int, input().split()))
C = list(map(int, input().split()))
cnt = 0
for c in C:
result = Counter(A)
cnt += result[B[c-1]] # n^2回実行で、TLE
print(cnt)