質問: プログラミングの問題について質問です。言語はpythonです。詳しい方、よろしくお願い致します。 [問題] p 人のグループ a , q 人のグループ b , r 人のグループ c があります。各グループのメンバーにはそれぞれ番号がつけられており、 a グループの i 番目の人は b グループの j 番目の人に仕事を任せ、 b グループの j 番目の人は与えられた仕事を c グループの k 番目の人に任せます。すると結局、 a グループの i 番目の人の仕事をするのは c グループの k 番目の人だということになります。 鈴木君は a グループの各人の仕事を結局 c グループの誰が行うことになるのか知りたがっています。 a グループの人のそれぞれが最終的に c グループの誰に仕事を頼むことになるのかを、 a グループの人の番号が小さい順に p 行出力してください。 p q r i_1 j_1 ... i_p j_p j'_1 k_1 ... j'_q k_q 1 行目には a グループ、 b グループ、 c グループのそれぞれの人数 p , q , r が半角スペース区切りで与えられます。 2 行目から (p + 1) 行目までは a グループの人の番号とその人が仕事を頼む b グループの人の番号 i_a, j_a (1 ≤ a ≤ p) が半角スペース区切りで、 (p + 2) 行目から (p + q + 2) 行目までは b グループの人の番号とその人が仕事を頼む c グループの人の番号 j’_b , k_b (1 ≤ b ≤ q) が半角スペース区切りで与えられます。 入力例1 出力例1 2 2 2 1 2 2 1 2 1 1 2 1 1 2 2 入力例2 出力例2 2 3 4 1 3 1 3 2 4 2 1 2 3 3 3 1 4 [解答例] a,b,c=map(int,input().split()) # print(a) ab={} bc={} for _ in range(a): i,j=map(int,input().split()) ab[i]=j for _ in range(b): j,k=map(int,input().split()) bc[j]=k ac={} for i in range(1,a+1): →1 # 範囲について ac[i]=bc[ab[i]] →2 #ここの意味がわからない print(ac[i]) ans=sorted(ac.items(),key=lambda x:x[0]) for n in range(a): i,k=ans[n] print(i,k) 質問 1.解答例の1の範囲が分かりませんでした。どのような仕組みでこの範囲にしているのか分かりませんでした。 2.2も、どのような仕組みになっているのか分かりませんでした。 ab[i]=j などはi,j=2,2 2,4 5,6の時 {2:2,2:4,5:6}となるのは分かります。 pythonに詳しい方、上記の質問に回答していただけると助かります。 よろしくお願い致します。
回答: > 流れは分かるのですが、ab[bc[i]]でもいいのではないかと思うくらい、あまりプログラムの書き方が理解できていない状況です。 具体的にどのあたりが分かりにくいのかわかりませんが、ab[bc[i]]に関しては... まず、リストの名前がどういう基準でつけられているかをしっかり把握する。 リストab, bc, acはそれぞれ2文字であらわされているが、その一つ目の文字は依頼する人が所属するグループ、二つ目の文字は依頼される人が所属するグループです。リストのインデックスは一つ目の文字グループに所属する人で、リストの要素(中身)は二つ目の文字グループに所属する人です。たとえば、bc[a]そのものはcに所属する人を要素としてもち、インデックスのaはbに所属する人となる。 最終的に求めたいものはaとcの関係であり、ac[i]です。再度繰り返すけど、iはaに属して、ac[i]の要素そのものはcに属する。 以上を踏まえると、 あなたのいうab[bc[i]]が持っている要素の値はbに属する人となるから、問題が求めているもの(cに属する人)とは違ってきます。さらにbcのインデックスはbに属する人であるべきで、bc[i]としてaの人iさんをインデックスとして持ち込むのは論理的におかしいですね。 ac[i]の話に戻ります。 ここからは、cのほうから逆にたどっていく。 まずbc[j]によりbのjさんに対するcのkさんがわかります。 k = bc[j] 次にjさん(bグループの人)をaの人iさんと関連付ける必要がある。これは j = ab[i]で、aのiさんとbのjさんが関連付けられます。 j = ab[i] 上の二つの式から、k = bc[j] = bc[ab[i]]となって、aのiさんと、cのkさんを関連付けることができる。 プログラムは慣れですから、ある程度場数を踏むと自然にこういうのは理解できるようになります。