どうもこんにちは!
今週もAtCoderのコンテストに参加できたので、記録がてら振り返ります。
今回はCまで完答。Cは解けたり解けなかったりしています。
問題
問題は以下のリンクから。取り組めたA~Cまでを振り返ります。
A - Doors in the Center -
文字列の長さnが与えられるので、以下の条件を満たす文字列を出力するというもの。
・文字列は - または =で構成。=は1個または2個で2個含まれる場合は隣接する。
・回文
これを満たすのは=が中心にあり前後に-が同数となる場合で、文字列が奇数なら=は1個、偶数なら2個となる場合。
文字列が奇数と偶数で場合分けして出力するようにしました。
n = int(input())
if n % 2 == 1:
s = '-'*((n-1)//2) + '=' + '-'*((n-1)//2)
else:
s = '-'*((n-2)//2) + '==' + '-'*((n-2)//2)
print(s)
B - Full House 3 -
与えられた7個の値から、それを組み合わせてフルハウスが作れるかを判定するという問題。(フルハウスはポーカーに出てくる役の1つで、ある数字が3個と別の数字が2個の組み合わせです)
7個の値の集合から、3個以上ある値と2個以上ある値の両方が存在するかどうかを判定するとしました。
s = [int(x) for x in input().split()]
cards_3 = False
cards_2 = False
for i in set(s):
if s.count(i) >= 3 and cards_3 == False:
cards_3 = True
elif s.count(i) >= 2:
cards_2 = True
if cards_3 and cards_2:
print("Yes")
else:
print("No")
C - Uniqueness -
N人がそれぞれ1個の値を持っていて、ほかの人が誰も持っていない値を持っている人のうち、最大の値を持っている人が何番目かを出力するという問題。(持っている値の最大値そのものを出力するではないです)
人数の最大は$3×10^5$、人が持つ値の最大は$10^9$です。
下記の手順で解きました。
1.配列の値をすべて見て、カードの値とそれを持っている人が何番目かを保持するディクショナリを作成。複数人が持っているカードは値を-1にして区別。
2.ディクショナリから1人だけ持っているカードの数値を抽出し、その値を出力
n = int(input())
s = [int(x) for x in input().split()]
count = {}
for i in range(n):
if s[i] not in count:
count[s[i]] = i+1
else:
count[s[i]] = -1
card = -1
for key,value in count.items():
if value != -1:
card = max(card,key)
if card == -1:
print(-1)
else:
print(count[card])
おわりに
3問目が解けたり解けなかったりですが、解けても残り30分も無くDにとりかかる余裕ないのが現状です。3月中のコンテストはあと1回、4問完答が第一目標ですが、Cまでは確実に完答できるようになることと、C完答時点で50分程度は残すことも目先の目標にして、引き続き取り組んでいきたいと思います。
ではでは。