思っちゃったんだからしょうがない

統計学を学ぶ傍でひっそりとやっていきます。 #statistics #R

AtCoder ABC114 参加メモ

最近AtCoderに参加し始めました!まだまだ弱いので目も当てられないRatingが続いていますが,備忘録的に書きます. AtCoder始めるまで,統計でRやPython,気が向いてc++やJSにちょっと触ったことあるぐらいでしたので,競プロ耐性はほぼゼロです.
AtCoderには,Rの次に慣れているPythonで参加しています. 過去問解いたり,蟻本読んだりして少しずつ勉強進めていますが,現状C問題が解けるか解けないかという間をさまよっています.

A問題

わかる.

B問題

珍しく簡単

s = input()
res = abs(753 - int(s[0:3]))

for i in range(1,len(s)-2):
    if res > abs(753 - int(s[i:i+3])):
        res = abs(753 - int(s[i:i+3]))

print(res)

C問題

時間内に解けませんでした.単純にfor文回したらだめで,どういう方針で解くか悩んでいるうちに時間切れ.終わってから解説読み,一晩寝かして考えたら解けました.

  1. とりあえず可能性のある数字を全部列挙する
    • 列挙するにあたり,まずは7,5,3のいずれかで構成される数字を列挙する.(7だけとか3だけもOK)
  2. 列挙したものの中から,条件を満たす要素数を数える
#----------------
# 入力パート
s = input()
#----------------

#----------------
# 列挙パート
all_list = []

# 3桁未満はありえないので3桁の数を列挙
for i in '753':
    for j in '753':
        for k in '753':
            all_list.append(''.join([i,j,k]))

# 与えられた数字の桁数まで,既に列挙してあるものの先頭に7,5,3を付け足していく
for i in range(4,len(s)+1):
    add_list = []
    for c in '753':
        add_list += [''.join(c+e) for e in all_list]
    all_list += add_list

# 重複を排除する
all_list = set(all_list)
#----------------

#----------------
# 回答パート 
# 各要素を集合に変換して{'7','5','3'}と同じになり,かつ与えられた数以下であるかを判定し合計する
res = sum([True for _ in all_list if set(list(_))=={'7','5','3'} and int(_) <= int(s)])
print(res)
#----------------

競技プログラミングにもっと早く出会いたかった.