今日の最終問題
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
聞いてみればなるほど、と思った。
もはやそれしか感想が思いつかないが。
私の中では、どうやってスキップしようかとか考えてたので、
他の変数に保存することが思いつかなかったなぁと反省。
勉強になりましたー。