ebisukeプログラミング初心者脱出黙示録

30歳を過ぎてから始めたプログラミングと競プロの記録。Pythonで取り組んでいます。Arduinoで電子工作も

AtCoder-ABC186 C - Unlucky 7【Python解答例】

AtCoderパナソニックプログラミングコンテストAtCoder Beginner Contest186)のC問題の解答例を書いていきます。
Panasonic Programming Contest (AtCoder Beginner Contest 186) - AtCoder

AtCoder Beginner Contest186 C - Unlucky 7

C - Unlucky 7

問題文

高橋君は7が嫌いです。
1以上N以下の整数のうち、10進法で表しても8進法で表しても7を含まないような数はいくつありますか?

制約

・1≤N≤10^5・Nは整数である。

解答例

n = input()
int_n = int(n)

ans = 0
for i in range(1,int_n + 1):
    can = 1
    str_i = str(i)
    for j in range(len(str_i)):
        if str_i[j] == "7":
            can = 0
    if can == 1:
        i = oct(i)
        str_o = str(i)
        for k in range(len(str_o)):
            if str_o[k] == "7":
                can = 0
        if can == 1:
            ans += 1

print(ans)

解説

問題文通り1以上N以下の整数のうち、10進法で表しても8進法で表しても7が出てこない数を求める問題です。
問題の意味は理解しやすいですね。

今回、入力Nをstring型で受け取りました。
ans変数を用意して解答になる数をかぞえていきます。

次のループ分で1からNまでの数字で、10進数でも8進数でも7が出てこないか調べていきます。
can変数は7が出てこなければ1、7が出てきたら0にする変数です。
調べる数はiですが、こちらもstr_i変数にstringとして格納します。
次のループで調べる数iにおいて10進数で各桁に7が出てこないか調べます。
7が出てきたらcan変数を0とします。

10進数で7が出てこなかったら次は8進数を調べます。
oct関数を使うと調べる数iを8進数に簡単に変更できました(コンテスト中にググるのに慣れてきました…)
次は10進数と同様に、各桁に7が出てこないか調べていきました。
同様に7が出てきたらcan変数に0を代入します。
10進数と8進数を調べた後でもcan変数が1ならば、7が出てこなかったことになりますので、ansに1を足します。

この処理をNまで繰り返せば求める解答となりACでした。

各桁と7を比較するときint型の7で比較してしまい、全然求める解答にならずあせりました。
iをstr型にしていたので比較対象もstr型で比較しないとダメなんですね…

コンテスト中はあたふたしましたが、なんとかC問題もクリアできました。
D問題以降は正解したことがないので、復習頑張りたいです。

D問題も理解出来たら記事にしていきたいと思います。




パナソニックプログラミングコンテスト(ABC186)の関連記事はこちら
ebisuke33.hatenablog.com