質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

310閲覧

Python AtCoderのABC071にてWAになる原因がわからない

Hin03

総合スコア14

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/02/07 17:51

前提・実現したいこと

ABC071-B
問題文
英小文字からなる文字列 S が与えられます.
S に現れない英小文字であって,最も辞書順(アルファベット順)で小さいものを求めてください. ただし,S にすべての英小文字が現れる場合は,代わりに None を出力してください.
制約
1≤|S|≤105(|S|は文字列 Sの長さ)
S は英小文字のみからなる.

引用:https://atcoder.jp/contests/abc071/tasks/abc071_b

発生している問題・エラーメッセージ

上記の問題にてWAとなります.
自身でコードテストした際にはエラーなど起きないので原因がわかりません.
教えていただけると幸いです.

該当のソースコード

from collections import Counter s = sorted(str(input())) s = list(s) l = list(Counter(s)) a = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'] if len(l) == 26: print('None') else: for i in range(len(l)): if l[i] != a[i]: print(a[i]) break

試したこと

問題文に記載してあるコードテストではすべて正常な答えが返ってきました.

補足情報

A問題が解けるようになってきましたので,B問題に挑戦したのですが躓きました.
初歩的なミスだと思うのですが原因がわかりませんでした....

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

Counter のイテレータの順序は保証されません。

python

1l = list(Counter(s)) 2print(l) # ['k', 'b', 'j', 's', 'f', 'l', 'e', 'a', 'd']

またもしlがアルファベット順だと仮定しても、例えば入力が abcde だと以下の l[i] != a[i] は起こりえません。

python

1 for i in range(len(l)): 2 if l[i] != a[i]: 3 print(a[i]) 4 break

改善案

string モジュールにアルファベットの一覧が定義されているので、利用します。

  1. 「Sに現れない英小文字」を 「アルファベット全体 - Sに現れるアルファベット」 という集合演算で求める。
  2. 差集合が空なら None、そうでないなら、sorted() でソートして、一番最初のアルファベットを出力する。
import string print(string.ascii_lowercase) # abcdefghijklmnopqrstuvwxyz def func(x): diff = set(string.ascii_lowercase) - set(x) if diff: print(sorted(diff)[0]) else: print('None') func('kllfdsjfaslsdklafjlajfeoaigeiaghjegjalk') # 'b' func('abcdefghijklmnopqrstuwxyzv') # 'None'

投稿2019/02/07 18:33

編集2019/02/07 18:37
tiitoi

総合スコア21956

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Hin03

2019/02/07 19:10

ご回答ありがとうございます。 ソート済みであれば、counterに入れても順序が保たれるのだと勘違いしており、if文についても、私の記述した条件が起こらない理由がわかりました。 間違いの指摘から改善案まで大変わかり易く説明頂いて本当にありがとうございます。もやもやが解消されました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問