paiza レベルアップ問題集 標準入力6「【N 個の整数の入力】1 行目で与えられる N 個の整数の入力 (large)」をPythonとGASの両方で解いたコードの紹介

この記事を読むことで、Pythonで標準入力inputや分割splitなどを用いて、数値の個数と全ての数値をループの中で出力することが可能になります。

GASではスプレッドシートで値を取得して、二次元配列にして出力しています。

このコーナーでは、プログラミング学習コンテンツpaizaラーニングレベルアップ問題集を、PythonとGAS(Google Apps Script)の両方で同じ問題を解いたコードを公開している学習ログです。

Python・GASのどちらの言語のコードも可能な限り詳細に解説致します。
GASはスプレッドシートのエディタを使ってコードを書いております。

Pythonではpaizaに入会しなくても問題集を解きたい方向けにpaiza.ioを用いております。paiza.ioの使い方はこちらから。

(入会するか否かは問題集を解いて見てからの読者様のご判断にお任せ致します。
どちらの選択をされても記事を読めるようになっておりますので、ご安心なさって下さい。)


【N 個の整数の入力】1 行目で与えられる N 個の整数の入力 (large) (paizaランク D 相当)

問題:
1 行目で、整数 N と、続けて N 個の整数 a_1, … , a_N が半角スペース区切りで与えられます。
a_1, … , a_N を改行区切りで出力してください。

ではまず、Pythonで解いて行きます。


手順として、

1: 1行目を標準入力inputやsplitなどを使って半角スペース区切りにした整数をリストarrayとして取得する

2: arrayの最初の数は整数の個数ですので、整数の個数を表す変数Nに代入して、N=array[0]とする


3: 上記で変数Nに代入したarray[0]を配列から削除するためにdelメソッドを使ってリストarrayを出力する5つの整数のみにする

4: 残りのリストarrayをループで出力する

・基本的なループ
・リスト出力に適したループ
・上記の内包表記

の4ステップで行います。

今回は入出力例1を用います。

入力例1
5 8 1 3 1 3

出力例1
8
1
3
1
3

まず、準備として、paiza.ioにこのように入力します。
(入力例1 をコピペしたのみ)

paiza問題集の入力例。1行に数値の個数と数値自体が入力されている。

この6個の数値「5 8 1 3 1 3」は下記のコードでリスト形式で取得出来ますが、1行に複数の関数などが使われているので、今回の例に即して簡潔にお伝えします。

input … 標準入力で文字や数値を取得する

split … 半角スペースなどの指定の区切り文字で分割して取得する

int … 上記で取得する対象が整数である


rstrip … 右側にある不要な空白を取り除く


map … まとめて適用


list … リスト(配列)変換

#1行分を全てリスト形式になる様に標準入力で取得する
array=list(map(int,input().rstrip().split(' ')))

#リストarrayに取得出来たことを確認する
print(array)

このコードの実行結果です。
数値の個数5を含めた整数1行分がリストarrayに出力されました。

取得したリストarray


このコードの先頭の5、つまりarray[0]を数値の個数を表す変数Nに代入します。

array=list(map(int,input().rstrip().split(' ')))
print(array)

#リストの先頭の「5」をリストの個数を表す変数Nに代入する
N=array[0]

#Nに代入できたことを確認する
print(N)

このコードで、無事にNに5が代入されました。

リストから数値の個数の先頭の5を代入されたことを確認。


現在のarrayから、リストの個数であるNに代入した先頭の5をdelメソッドを使って削除します。

array=list(map(int,input().rstrip().split(' ')))
print(array)

N=array[0]
print(N)

#数値の個数Nに代入したリストarrayの先頭の5を削除する
del array[0]

#削除されたことを確認する
print(array)
リストから先頭の要素をdelで取り除いた画像。

リストarrayから個数が削除され、出力すべき数値のみになりました。


では、リストの残ったarrayをループを用いて解答の出力例に沿って縦に出力します。
最も基礎的なループでは、この様な解説とコードになります。

ループの中では、iの値が0,1,2,3,4の5つ、1つ分増えて行きます。
リストの添字は0から始まり、N=5ですのでarray[i]は、

array[0]=8
array[1]=1
array[2]=3
array[3]=1
array[4]=3

の5つの値が取得出来ます。

for i in range(N):

array=list(map(int,input().rstrip().split(' ')))
print(array)

N=array[0]
print(N)

del array[0]
print(array)

#基本的なループでリストarrayを出力
for i in range(N):
    print(array[i])

出力結果です。

ループを用いたリストの出力結果の確認

ここで、確認用に出力した変数や配列をコメントアウトします。

array=list(map(int,input().rstrip().split(' ')))
#print(array) ←コメントアウト

N=array[0]
#print(N) ←コメントアウト

del array[0]
#print(array) ←コメントアウト

#基本的なループでリストarrayを出力
for i in range(N):
    print(array[i])

基本的なループを用いて、解答の形に沿った縦型に出力出来ました。

paiza問題集ループを用いたリストの出力結果

次の少しだけ応用編(シンプルになるだけですので、大丈夫です)のループの出力に備えて、コメントアウトした分のコードを削除します。

array=list(map(int,input().rstrip().split(' ')))
N=array[0]
del array[0]


#基本的なループでリストarrayを出力
for i in range(N):
    print(array[i])


次に、リストを使った、更に便利なループの表記方法について掲載致します。

for リストの要素の文字 in リスト名:

今回の例ですと、

for num in array:

等になります。

リストの要素の所は自分や他の方が見て分かりやすい「num」などにすると、「整数を取り出すんだな」と伝わりやすいです。

array=list(map(int,input().rstrip().split(' ')))
N=array[0]
del array[0]


#arrayをリストに適したループで出力する
for num in array:
    print(num)

少しだけシンプルなコードで同じ出力結果が得られました。


更にコード短くするには、ループをたった1行で表記する内包表記を用います。

[出力結果のprint文 for リストの要素の文字 in リスト名]

今回の例ですと、

[print(num) for num in array]

と表記致します。

array=list(map(int,input().rstrip().split(' ')))
N=array[0]
del array[0]


#リストarrayを内包表記で出力する
[print(num) for num in array]

Pythonは以上です。
次は、GASで解いて行きます。


今度は、同じ問題をGASで解いてみます。
まず、スプレッドシートにこの様に配置しました。

paizaの問題集をGoogle Apps Scriptで解くためのスプレッドシートの初期画像

入力の緑のセルA2の所に、paiza側の入力例1を貼り付けています。
その際、paiza側でコピーをした後、スプレッドシートのA2のところで、[Ctrl] + [Shift] + [V] を押すと、書式を崩さずに綺麗に貼り付けられます。

緑色のセルA2(2,1)の所に出力する数値と先頭の数値の個数5個を加えた「5 8 1 3 1 3」が入力されています。

先頭の5を除いた数値をC2(2,3)から始まる黄色いセル5行分に出力します。

その際、この黄色いセルの所には、二次元配列として取得した整数が格納された配列を出力します。

※スプレッドシートに表示する場合は、二次元配列としての配列に追加をして作成します※

手順はこのようになります。

1: SpreadSheetAppから階層を辿って現在のシートにアクセスする

2: 緑色のセルA2(2,1)を配列arrayに取得


3: 取得したarrayをログ出力


4: 数値の個数array[0]=5を定数Nに代入する


5: Nに代入したarray[0]を削除して出力する分の数値のみを残す

6: スプレッドシートに出力用の空の配列array2を宣言して、残った一次元配列であるarrayの要素をループを用いて二次元配列array2に格納する


7: スプレッドシートに出力する前に二次元配列array2をログ出力する


8: スプレッドシートのC2(2,3)から始まる黄色いセルに5行分出力する

手順1: SpreadSheetAppから階層を辿って現在のシートにアクセスする

const ss = SpreadsheetApp.getActiveSheet();

ここで定数ssにSpreadsheetAppから階層を辿ってアクティブシートにアクセスしています。

下記のコードを関数「standardInput5」の中に書いて行きます。

Standard Inputで標準入力の意味です。

function standardInput5() {

  //SpreadSheetAppから階層を辿って現在のシートにアクセスする
  const ss=SpreadsheetApp.getActiveSheet();

}


手順2:緑色のセルA2(2,1)を配列arrayに取得

const array=ss.getRange(2,1).getValue().split(‘ ‘);

function standardInput5() {

  const ss=SpreadsheetApp.getActiveSheet();

  //色のセルA2(2,1)を配列arrayに取得
  const array=ss.getRange(2,1).getValue().split(' ');

}


手順3:取得したarrayをログ出力

console.log(array);

コードと実行結果です。

function standardInput5() {

  const ss=SpreadsheetApp.getActiveSheet();
  const array=ss.getRange(2,1).getValue().split(' ');

  //取得したarrayをログ出力する
  console.log(array);

}

取得した配列array


手順4:数値の数であるarray[0]=5を定数Nに代入する

const N=array[0];

下記のコードと実行結果です。

function standardInput5() {

  const ss=SpreadsheetApp.getActiveSheet();

  const array=ss.getRange(2,1).getValue().split(' ');
  console.log(array);

  //数値の数であるarray[0]=5を定数Nに代入する
  const N=array[0];

  //Nに5が代入されたことを確認する。
  console.log(N);

}

配列の先頭要素を定数Nに数値の個数として代入した実行結果の画像

配列arrayの先頭の5が無事にNに代入されました。


手順5: Nに代入したarray[0]を削除して出力する分の数値のみを残す

array.shift();

このshiftを用いて、arrayの先頭の数値の個数を削除します。

function standardInput5() {

  const ss=SpreadsheetApp.getActiveSheet();

  const array=ss.getRange(2,1).getValue().split(' ');
  console.log(array);

  const N=array[0];
  console.log(N);

  //Nに代入した配列arrayの先頭を削除
  array.shift();

  //配列から先頭にあった数値の個数5が削除されていることを確認
  console.log(array);

}
配列にshiftを用いて、先頭の要素を削除した後の配列array

この様に、配列.shift();を使うと先頭の要素が削除されたことが確認出来ました。


手順6:スプレッドシートに出力用の空の配列array2を宣言して、残った一次元配列であるarrayの要素をループを用いて二次元配列array2に格納する

ループの部分は、

let i=0; i<N ; i++

と表記しています。
iには、array[i]の添え字として0から4まで入ります。
N=5ですので、i<Nになります。

array2.push([array[i]]);

また、ループの中で[array[i]]とarray[i]全体にカッコで括っているのは、二次元配列としてarray2に追加をしている為です。

function standardInput5() {

  const ss=SpreadsheetApp.getActiveSheet();

  const array=ss.getRange(2,1).getValue().split(' ');
  console.log(array);

  const N=array[0];
  console.log(N);

  array.shift();
  console.log(array);

  //スプレッドシート出力用の空の配列array2を宣言
  const array2=[];

  //ループを用いて残りのarrayを二次元配列としてarray2に格納する
  for(let i=0;i<N;i++){
    array2.push([array[i]]);
  }

}


手順7:スプレッドシートに出力する前に二次元配列array2をログ出力する

console.log(array2);

前の手順でarrayからpushを持ちて二次元配列になるようにループで格納したarray2がスプレッドシートに出力可能な二次元配列の形になっていることを確認します。

array2がスプレッドシートに出力可能な二次元配列になっていることをログで確認


手順8:スプレッドシートのC2(2,3)から始まる黄色いセルに5行分出力する

ss.getRange(2,3,N).setValues(array2);

セルC2が(2,3)です。
getRange(2,3,N)でN行、つまり5行分出力をします。
getRange(2,3,N,1)と書くと1列分の列数も指定出来るのですが、1列の場合は省略可能です。

setValuesとsが付く複数形になっているのは、出力用配列array2に格納された数値の個数が5個と複数になっているからです。

コード実行後のスプレッドシートです。

function standardInput5() {

  const ss=SpreadsheetApp.getActiveSheet();

  const array=ss.getRange(2,1).getValue().split(' ');
  console.log(array);

  const N=array[0];
  console.log(N);

  array.shift();
  console.log(array);

  const array2=[];

  for(let i=0;i<N;i++){
    array2.push([array[i]]);
  }

  console.log(array2);

  //スプレッドシートのC2(2,3)から始まる黄色いセルにN=5行分の数値を出力する
  ss.getRange(2,3,N).setValues(array2);

}
Google Apps Script実行後のスプレッドシート。二次元配列の数値を黄色いセルの所に出力している。

無事に黄色いセルに数値5個分が出力されました。

※ この記事の作成に参考になったサイトです ※
ありがとうございます。

Python「rstrip() メソッド」で文字列の右端を整えよう!
Python mapの使い方
Pythonでlistから要素を削除する方法

GASは以上です。


お疲れ様でした。ブレイクタイムPhotoは、

奥多摩の秋川渓谷を散策中に撮影した、東京都檜原村にある「払沢の滝」滝壺です。

←前の問題へ          標準入力その7→

ご精読有難うございました。

■ GASの入門書の紹介です ■

詳解! Google Apps Script完全入門 [第3版]
単行本
Kindle版(電子書籍)

■ 関連記事 ■

paizaレベルアップ問題集「標準入力6」へ戻る
paizaレベルアップ問題集_PythonとGASのコード紹介トップページへ

写真クリエイターとしての活動
自己紹介