1
0

More than 3 years have passed since last update.

ABC161D Lunlun Number with python3

Posted at

ABC161D Lunlun Number

正解コード

import queue
q = queue.Queue()
for i in range(1,10):
    q.put(i)
K = int(input())
for k in range(K):
    x =q.get()
    last = x % 10
    if last != 0:
        q.put(10*x + last - 1)
    q.put(10*x + last)
    if last != 9:
        q.put(10*x + last + 1)
print (x)

考え方

1から9のルンルン数から末尾に一の位の数との差が1以下である数を付け足して新たなルンルン数を生成していく。そして生成されたルンルン数からまた新たにルンルン数を生成していく。K個目のルンルン数が生成されたら処理を終了する。

ポイント1

K個のルンルン数全てをリストに格納するとメモリをめちゃくちゃ食うことになる。
そこで、リストの代わりにqueueを使うと新しくルンルン数を生成し終わった用済みのルンルン数をget関数でメモリから追い出していくことができる。

ポイント2

今回の問題では1の位が0か9かそれ以外かで場合わけする必要がある。場合わけはできるだけ完結に書きたい。
恥ずかしい限りだが自分は最初次のように書いていてしまった。

if last==0:
    q.put(10*x + last)
    q.put(10*x + last + 1)
elif last==9:
    q.put(10*x + last)
    q.put(10*x + last - 1)
else:
    q.put(10*x + last)
    q.put(10*x + last - 1)
    q.put(10*x + last + 1)

こうならないためには同じ処理を2度書かないということを意識すればいい。
場合に対して処理を書くのではなくある処理をどの場合に行うかを考えると自然に綺麗なコードになる。

まとめ

queueを使うとメモリ削減になる!
場合分けは処理->場合の流れで考えろ!

1
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0