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

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

新規登録して質問してみよう
ただいま回答率
85.48%
コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Python

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

Q&A

解決済

2回答

1521閲覧

AtCoder / Python エラーコードの反例が見当たらない

kay_ventris4

総合スコア269

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Python

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

0グッド

2クリップ

投稿2021/04/05 14:25

編集2021/04/05 14:26

#問題
イメージ説明
AtCoder ABC157 C問題より

#方針
1.各桁の「箱」をリスト型として辞書の値に空の状態から生成。
2.とりあえず入力から値をリストにappendする。
3.重複を剥ぎ取ってもなおリストに複数値が埋め込まれている場合、この時点で-1を出力
4.3でない場合、出来上がった辞書になお空リストが存在する場合、'0'を入れてあげることで最小値を与えるようにする。
5.'0'という一桁の文字列という例外を除いて、'007'などという文字列はstr(int())とすることで桁数が変わることから、ansがこの条件に合うものであれば-1を出力
6.それ以外の場合、int(ans)を出力

#コード

Python

1N, M = map(int, input().split()) 2 3num_dic = {} 4for i in range(1, N + 1): 5 num_dic[i] = [] 6 7for _ in range(M): 8 s, c = map(int, input().split()) 9 num_dic[s].append(str(c)) 10 11if any(len(list(set(num_dic[i]))) >= 2 for i in range(1, N + 1)): 12 13 print(-1) 14 15else: 16 17 ans = '' 18 for i in range(1, N + 1): 19 if len(num_dic[i]) == 0: 20 num_dic[i].append('0') 21 22 num_dic[i] = list(set(num_dic[i])) 23 24 ans += num_dic[i][0] 25 26 27 if len(str(int(ans))) != len(ans) and ans != '0': 28 print(-1) 29 30 else: 31 print(int(ans))

#質問
本来であれば、Nの制約が非常に小さいことから全探索を行うところなのですが、先にNという数の各桁に何を埋め込むかという戦法を取りました。いくつかの情報を検索して集めたところ、このやり方はどうやら0の扱いなどで穴が空きやすいとのことでしたが、上記のエラーコードで言うとどういったところが抜け目になってしまっているのでしょうか。またあるとしたらどのような入力の反例がありますでしょうか。雑な質問とはなってしまいましたが、お力添え頂ける箇所がございましたら、ご教授のほどどうかよろしくお願い申し上げます。

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

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

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

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

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

guest

回答2

0

ベストアンサー

2 03 0など、N2以上でM0の時にWAとなる

投稿2021/04/05 19:42

modieu

総合スコア282

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

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

kay_ventris4

2021/04/06 09:32

なるほど、例えばN, M = 2, 0で出力を受けた時私のプログラムで出力されるのは-1ですが、本来であれば10が出力されるべきですものね。これからは制約を与えられた時は両端の極端な例をしっかりと検証するようにしたいと思います。そしてやはり実装のコストを考えると、この問題の場合全探索が良さそうな感じはしますね…
guest

0

結局上のやり方はだいぶ厳しい(現在の私の実力にとっては)ので、全探索を試したところ、驚くほどあっさりできました:

Python

1N, M = map(int, input().split()) 2 3digit = [ 4 [str(_) for _ in range(0, 10)], 5 [str(_) for _ in range(10, 100)], 6 [str(_) for _ in range(100, 1000)] 7] 8 9obj = digit[N - 1] 10 11for _ in range(M): 12 s, c = map(int, input().split()) 13 obj = [el for el in obj if el[s - 1] == str(c)] 14 15if len(obj) >= 1: 16 print(min(obj)) 17 18else: 19 print(-1)

投稿2021/04/06 09:53

kay_ventris4

総合スコア269

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問