kmjp's blog

競技プログラミング参加記です

AtCoder ARC #002 : Python練習編

どんどん行きましょう。
http://arc002.contest.atcoder.jp/assignments

A - うるう年

年に対して閏年判定を行う問題。
題意通りに処理すればよい。1行でも書けそうだけど、練習なのでじっくり書いた。

Y=input()
R="NO"
if Y % 4 == 0:
	R="YES"
if Y % 100 == 0:
	R="NO"
if Y % 400 == 0:
	R="YES"

print(R)

B - 割り切れる日付

指定された日付以降で、年を月と日で割ると割り切れる日を探す問題。
先ほど作った閏年判定コードを使って、1日ずつインクリメントして探せばよい。
何気に初めての正規表現。

def inc(D):
	mm = [0,31,28,31,30,31,30,31,31,30,31,30,31]
	if D[0] % 4 == 0:
		mm[2] += 1
	if D[0] % 100 == 0:
		mm[2] -= 1
	if D[0] % 400 == 0:
		mm[2] += 1
	D[2] += 1
	if D[2] > mm[D[1]]:
		D[2] = 1
		D[1] += 1
	if D[1] > 12:
		D[0] += 1
		D[1] = 1
	return D

A=raw_input()
r=re.compile("(\d+)/(\d+)/(\d+)")
m=r.search(A)
da=[int(m.group(1)),int(m.group(2)),int(m.group(3))]

while da[0] % (da[1]*da[2]) > 0:
	da = inc(da)

print "%04d/%02d/%02d" % (da[0],da[1],da[2])

C - コマンド入力

ABXYの4文字で与えられるコマンドで、L・Rに連続する2文字のマクロ機能を割り当ててコマンド数を最小にする。
LとRの候補はそれぞれ16通りしかないので、全パターン試せばよい。

def cnt(C,L,R):
	c=0
	i=0
	while i < len(C):
		c += 1
		if i==len(C)-1:
			break
		
		if C[i:i+2]==L or C[i:i+2]==R:
			i += 2
		else:
			i += 1
	return c

N=input()
C=raw_input()

mc=N
for L1 in ["A","B","X","Y"]:
	for L2 in ["A","B","X","Y"]:
		for R1 in ["A","B","X","Y"]:
			for R2 in ["A","B","X","Y"]:
				L=L1+L2
				R=R1+R2
				mc=min(mc,cnt(C,L,R))

print(mc)

まとめ

リストに対するfor文とかはC++より書きやすいね。