0
0

【行によって長さが違う二次元配列の表示】すべての行の長さと値が不定な 2 次元配列の出力 Python3編

Posted at

今日の最終問題
https://paiza.jp/works/mondai/stdout_primer/stdout_primer__variable_array_boss
たとえば、こんなふうに入力が与えられるとすると

10 4
1 2 3 4 5 6 7 8 9 10
2 6 1 1

最初の行は全部の数と、行数
2行目は全部の数
3行めは何番目まで出力するかを示している
つまり、3行目は 2文字まで、6文字まで、1文字まで、1文字まで、というのを表している。
出力は
1 2
3 4 5 6 7 8
9
10
となる。


さて、解いてみたが、最後の最後、一方のループを止めず、一方のループをリセットする方法が見つからずギブアップ。
参考までに私が書いたやつ。

tmp = input().split()
N = int(tmp[0])
M = int(tmp[1])

values = input().split()
A =[0] * N
for i in range(N):
    A[i] = int(values[i])
    
nums = input().split()
B = [0] * M
for j in range(M):
    B[j] = int(nums[j])

for k in range(1,N+1):
    
    for l in B:
        if k == l:
            print(k)
        else:
            print(k,end=" ")
        k = k + 1

10 4
1 2 3 4 5 6 7 8 9 10
2 6 1 1

で正解はどうするかというと、
途中までは合っていたらしいが、
一方のループを止めないところをどうするか。

まず、A配列は1〜10。B配列は何文字目までを止めるかを配列に入れている。

で、まず、Bループを回して
i、つまり上の場合だと、まず2が出てくる。
そこまでをforループで range関数に引数iにして、jで回す。
そうすると1~3まで出力できる。そこで、i-1になるときに改行すればOK
このとき、iは使えないので別の変数、下の場合headを使う。これをつかうことで、
iとは関係なく、Aループのheadを保存することができる。
その次は3文字目から6文字目までだが、headがこのとき開始indexを保存しているので
引き続き出力が可能になる。

head = 0
for i in B:
    for j in range(i):
        if j == i - 1:
            print(A[head])
        else:
            print(A[head], end=" ")

        head += 1

聞いてみればなるほど、と思った。
もはやそれしか感想が思いつかないが。
私の中では、どうやってスキップしようかとか考えてたので、
他の変数に保存することが思いつかなかったなぁと反省。
勉強になりましたー。

0
0
0

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
0
0