はじめに
はじめまして、SLOTREと申します。
最近、pythonのお勉強をはじめたばかりの駆け出し君です。
作りたいものもあるけれど、まずは基礎力をつけるために・アルゴリズムを理解するためにAtcoderで勉強をはじめてみました。
ぜひ、こうしたら良いよ!ってアドバイスあれば教えていただけるとありがたいです。
やってみた問題
人1~人iまでのリストが与えられて、注目する人P(リストの最後に加える)は人1の何世代前ですか?って問題。
人は3人、注目する人をPとすると、人1、人2、人3、Pのリストになって人1はPの3世代前だよ!って答えになる。
正直、この2行を理解するのに結構かかってしまった・・・
もしかして、プログラミング力より国語力高めないといけない・・・?w
・問題文 B - Ancestor
N 人の人がいます。N 人の人には人 1, 人 2,…, 人 N と番号がついています。
人 i(2≤i≤N) の親は人 Piです。
ここで、Pi <i が保証されます。
人 1 が人 N の何代前か求めてください。
(見づらい方は、リンク先を見てみてください)
コード
import numpy as np
# ---定義部---
P = int(input()) #注目する人
number = input() #世代のリスト(人1~人i)
array = np.array(number.split(" "),dtype = np.int)
gen = np.append(array, P)
last = -1
top = 0
gen_ago = 0 #何世代前か
gen_now = gen[last]
target = gen[top] #人1
# ---処理部---
while gen_now != target:
gen_now = gen[last]
last -= 1
gen_ago += 1
print(gen_ago - 1)
考え方
とりあえず、与えられたリストの末尾に注目する人Pをくっつけるみたいなのでつけました。
そこから、target(人1)にgen_nowが同値になるまでひたすらにループさせます。
そして、こうすると注目する人Pも1世代に含まれてしまうので、ー1した数を表示させてます。
感想
正直、問題で与えられる値を見ると全部1,2,3,4・・・と並んでいるので、P-1を表示させればいいんじゃないかと思いました。
ただ、それだと練習にならないので2,3,5,7・・・みたいに飛び飛びになる場合もあると考えてやってみました。
なんとなく、Pも含んだリストを作るのってもっと簡単になるんじゃないかな・・・?とも思いましたが、自分ではわからなかったのでこうなってます。
疑問点
import numpy as np
# ---定義部---
P = int(input()) #注目する人
number = input() #世代のリスト(人1~人i)
array = np.array(number.split(" "),dtype = np.int)
gen = np.append(array, P)
この部分なんですが、下記のようにすると、「'NoneType' object is not subscriptable」というエラーがでてしまいました。
# ---定義部---
P = int(input())
number = list(input())
gen = number.append(P)
僕の理解としては、リストが空っぽなのに、リストの最後をとってくる等の処理をしようとしているから、python君が空っぽのリストですよ・・・添え字なんかありませんよ・・・とエラーを出してくれているという理解です。
ただ、僕としてはlistに対してappendでPを最後につける処理をしているはずなのに、なぜNoneType型になってしまっているのかがわかりませんでした。
もし、お優しい有識者の方がいらっしゃれば解説していただけるとありがたいです。