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

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

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

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

Q&A

解決済

2回答

1538閲覧

Pythonのタイムアウトについて

Charowan

総合スコア17

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

0グッド

0クリップ

投稿2020/06/05 03:35

編集2020/06/05 05:06

#Pythonで問題を解いているのですがTimed Outと出てしまい、どうしていいか分かりません。
(問題)
We want make a package of goal kilos of chocolate. We have small bars (1 kilo each) and big bars (5 kilos each). Return the number of small bars to use, assuming we always use big bars before small bars. Return -1 if it can't be done.
チョコレートのパック(goal)を作りたい。1kgの小さいチョコバーと5kgの大きいチョコバーがある。小さいチョコバーはいくつ必要かを返しなさい。(最初に大きいチョコバーを用いてください)また、作れない場合は-1を返してください。make_chocolate(small,big,goal)
smallには1kgのチョコバーの数、bigには5kgのチョコバーの数、goalには目標のkgを渡します。
make_chocolate(4, 1, 9) → 4
make_chocolate(4, 1, 10) → -1
make_chocolate(4, 1, 7) → 2
自分のコードはいかになります。

Python

1def make_chocolate(small, big, goal): 2 if goal>small+big*5: 3 return -1 4 if goal<5: 5 count=0 6 for i in range(1,small+1): 7 zero=goal-1 8 count+=1 9 if zero==0: 10 return count 11 if zero!=0: 12 return -1 13 else: 14 target=goal 15 amount=big 16 for i in range(big): 17 target=goal-5 18 amount-=1 19 if target>=5 and amount!=0: 20 continue 21 if target<5: 22 break 23 if amount==0: 24 break 25 if target<=small: 26 return target 27 else: 28 return -1

Pycharmで確認したところしっかりと値を返しているのですがどのように実行時間を縮めるのでしょうか?方法を教えて頂けると大変助かります。

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

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

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

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

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

jeanbiego

2020/06/05 03:53

引数にsmall, big, goalとありますが、それぞれどのような意図の変数なのか説明を書いてください。
guest

回答2

0

ベストアンサー

主さんの回答はO(N)なのでtime outになったのかもしれませんね。
以下僕ならこう書きます。これ以上簡単にならないと思います。O(1)

py3

1def make_chocolate(small, big, goal): 2 remains = goal - min(big, goal // 5) * 5 3 if remains <= small: 4 return remains 5 return -1 6 7 8assert make_chocolate(4, 1, 9) == 4 9assert make_chocolate(4, 1, 10) == -1 10assert make_chocolate(4, 1, 7) == 2

投稿2020/06/05 06:28

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

Charowan

2020/06/05 09:23

ありがとうございます。私は初心者なのでわからないことが多いのですが、O(N)とはなんでしょうか? またどのようにしたらそのような短くてかつ正確なコードを書くことができるのでしょうか?練習を重ねていくうちにできるようになるのでしょうか? 質問が多くてすいません。
退会済みユーザー

退会済みユーザー

2020/06/05 21:52

Oはランダウのオーと呼ばれるもので、ソフトウェアの世界では計算の複雑さを表します。Oは計算時間(time complexity)とメモリの使用(space complexity)それぞれについて考えないといけないのですが、何も言わなければ一般に計算時間のことです。ざっくり言って入力した値NについてforループがあればO(N)です。二重のforループがあればO(N^2)となって計算は爆発的に増えます。 コードの書き方は逐次的な書き方をなるべく避けることを心がけています。例えばforループやif/elseが避けられないかを考え、専用の関数があればそれを使います。今回ならmin(a, b)を使うことでif文が一つ減りました。関数型言語やSQLのような宣言的な書き方しか許さない言語もありますが、そこまで厳しくやるわけではなくざっくりとした方針です。
Charowan

2020/06/06 09:02

そうなんですね。そしたら以前私が競技プログラミングなどで提出したものが実行時間超過になるのはforループをたくさん使ってたからなんですね! 分かりました。 丁寧な回答ありがとうございます。感謝しています!!
guest

0

  • 引数にbigとsmallを与えるのは、そうしないと行けない理由が問題文(の書かれてないところ)にあるのですか?

→あ、Kenjiさんの回答みてわかりました。手持ちのsmallとbigの個数でgoalが作れるかという問題だったんですね。だとすると私のコードは間違ってますね。
~~そのへんがよくわかりませんが、簡単に書くと下のようになるかと思います。
~~

python3

1def make_chocolate(goal): 2 big_wt = 5 3 if goal < big_wt: 4 return -1 5 return goal % big_wt # goalをbigのweight(5kg)で割った余り=small(1kg)の個数 6print(make_chocolate(9)) 7# 4 8print(make_chocolate(10)) 9# 0 10print(make_chocolate(7)) 11# 2

投稿2020/06/05 06:27

編集2020/06/05 06:31
jeanbiego

総合スコア3966

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

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

Charowan

2020/06/05 09:20

問題で引数は必ず(small, big, goal)でなければなりません。3つの引数を渡してsmallの個数とbigの個数でgoal(kg)が作れるかという問題です。説明不足ですいません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問