Port 53

明日のための技術メモ

AtCoder ABC150

AtCoder ABC150解いた分だけまとめ。
今回はピアノ発表会の前日で睡眠を優先したため参加せず、後で解きました。
結局問題不備でUnratedになったらしいですね...運営の皆様お疲れ様です...汗

C問題で全探索が出たので、next permutationをキメた。

目次

A. 500 Yen Coins

問題文 f:id:saturn-glave:20200114212249p:plain

単純に500円×枚数を計算してx円以上かそれ未満かで出力変えるだけ。おしまい。

#coding:utf-8
k, x = map(int, input().split())

if k * 500 >= x:
    print('Yes')
else:
    print('No')

B. Count ABC

問題文 f:id:saturn-glave:20200114212635p:plain

文章sについて、1文字目から最後より3つ手前の文字まで、
順番にそこから3文字分を取り出してABCが何回出るか数えるだけ。
地味にスライスする時・for文で回す時に開始と終了の位置ずれを起こしがちなので、
慣れないうちはprintデバッグが欠かせない。

#coding:utf-8
n = int(input())
s = input()
count = 0

for i in range(0, n-2):
    #print(s[i:i+3])
    if s[i:i+3] == 'ABC':
        count += 1

print(count)

C. Count Order

問題文 f:id:saturn-glave:20200114213436p:plain

ここは難しいので解説ACで。
全探索ですべての組み合わせを出し、若い順に並べ替えておく。
p, qがその何番目にいるかを求めたら、その絶対値を求めて終了。

ポイント

1. 全探索に使うライブラリ
全探索をPythonでする時は、itertools.permutations を使う。
C++で言う、next permutationに相当するもの。
すべての順列を出力してくれる。リストに結果を入れるとタプルのリストになった。

2. タプルを入力に取る
tuple(map(int, input().split()))のようにできる。

3. リストやタプルの要素のインデックスを求める
list.index(item)とすると要素itemのインデックスが返ってくる。タプルも同じ。

ACしたコード

#coding:utf-8
#全探索
import itertools
n = int(input())
#permutationすると各結果がタプルで返るので入力をタプルにする
p = tuple(map(int, input().split()))
q = tuple(map(int, input().split()))

#全部の並べ替えパターンを列挙,ついでにソートしておく
pattern = sorted(list(itertools.permutations(p)))
#print(pattern)
print(abs(pattern.index(p) - pattern.index(q)))