[HackerRank] プログラミングコンテスト復習02 [Week of Code 24:Happy Ladybugs]
Contest 2問目。
02: Happy Ladybugs
概要
ボードゲーム: Happy Ladybugs
てんとう虫は、隣が同じ色のてんとう虫であれば嬉しい。
なので、空いている場所へ移動して同じ色同士隣あおうとする。
RBY_YBR
てんとう虫をアルファベットで表す。同じアルファベットは同じ色のてんとう虫を意味している。_
は空白地帯を表していて、てんとう虫はこの空白地帯で移動できる。
例えば
RBYBY_R
と、てんとう虫B
が移動する。この例は最終的に
BBRRYY_
と移動して全てのてんとう虫が隣り合い幸せな状態となる。
入力されたてんとう虫が全て幸せになれるならYES
を、そうでなければNO
を出力する。
方針
同じアルファベットが2文字以上存在
且つ
空いた場所が1箇所以上存在
すれば、てんとう虫は移動できて、同じ色同士集まることができる。
正規表現を利用して、アルファベットが2文字以上存在するか確認する。
てんとう虫を表す文字列bugs
を並び替える。
set
関数でユニークな文字列を得る。 -> b_set
並び替えた文字列に対して、各アルファベットが2文字以上存在するか正規表現でチェックし、set
関数に収める。 -> r_set
空間をset
関数に収める。 -> u_set
b_set
から差分を取って、何も残らなかったら、てんとう虫は全て幸せである。
なにか残ったら幸せではない。
例: B_RRBR
u_set = set(['_'])
b_set = set(['R', 'B', '_'])
r_set = set(['R', 'B'])
b_set - r_set - u_set
-> set([])
てんとう虫は隣り合える。
例: X_Y__X
u_set = set(['_'])
b_set = set(['Y', 'X', '_'])
r_set = set(['X', '_'])
b_set - r_set - u_set
-> set(['Y'])
てんとう虫は隣り合えない。
コード
#!/bin/python
import re
def check(bugs):
if '_' in bugs:
bugs = ''.join(sorted(bugs))
u_set = set('_')
b_set = set(bugs)
r_set = set(re.findall(r'(.)\1', bugs))
if not bool(b_set - r_set - u_set):
print 'YES'
else:
print 'NO'
for i in range(int(raw_input())):
m = int(raw_input())
check(raw_input())
結果
Result: Accept
Score: 20pt
考察
単純に並び替えれば同じアルファベットが並ぶだろうから、各アルファベットが2文字以上あればいいだろうと考えた。
for文で数え上げることも考えたが、直近で正規表現を使う項目を学んだので、利用した。
もう少し、スマートなやり方がある気がするが、全テストケースで通ったので改善はのちのち。