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

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

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

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

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

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

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


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

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

ではまず、Pythonで解いてみます。


手順として、

1: 1行目を標準入力で整数型Nとして取得する

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

3: リストarrayをループで出力する

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

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

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

入力例1
5
8 1 3 10 100

出力例1
8
1
3
10
100

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

Green execute button labeled 実行 (Ctrl-Enter) at the top, with a numeric input area below showing a tab labeled 入力 and numbers: 5 and 8 1 3 10 100.

まずは、1行目の数値の個数5を標準入力で取得して、変数Nに代入して、正しく取得できたことをprint関数で確認します。

#1行目を標準入力で数値として取得して個数Nに代入する
N=int(input())

#数値の個数Nが取得できたことを確認する
print(N)

実行結果です。

Green rounded Run button labeled 実行 (Ctrl-Enter) with an arrow icon; a tab strip shows 出力, 入力, コメント with a blue 0 badge, and the content area displays 5.

無事に数値の個数N=5個が取得出来ました。

入力例2行目の5個の数値「8 1 3 10 100」は下記のコードで取得出来ますが、1行に複数の関数などが使われているので、今回の例に即して簡潔にお伝えします。

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

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

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


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


map … まとめて適用


list … リスト(配列)変換

上記を用いてコードを掲載致します。
一気に色々出て来てしまいましたので、まずは、標準入力で取得した数値がリスト(配列)形式でarrayに取得出来たことをprint文で出力して確認します。

N=int(input())
print(N)

#2行目からN個分の数値をリストarrayに取得
array=list(map(int,input().rstrip().split(' ')))

#リストarrayにN個の数値が格納されたことを確認する
print(array)

出力結果です。

Green execute button labeled 実行 (Ctrl-Enter) at top; below, UI tabs and a pink outlined input area containing the array [8, 1, 3, 10, 100].

これで、リストとして無事に出力が出来ました。


では、リスト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]=10
array[4]=100

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

for i in range(N):

N=int(input())

#確認用の出力の為、後で消す
print(N)

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

#確認用の出力の為、後で消す
print(array)

#リストarrayをループで出力する
for i in range(N):
    print(array[i])
    

出力結果です。

UI screenshot with a green Run button labeled 実行 (Ctrl-Enter), tabs for 出力, 入力, コメント, and a red-outlined vertical list showing 8, 1, 3, 10, 100 on the left.

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


ここで、一度コードの整理をしたいので、確認用に使ったprint文をコメントアウトします。

N=int(input())
#print(N)

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

#リストarrayをループで出力する
for i in range(N):
    print(array[i])


この状態で実行すると、

Green rounded Run button labeled 実行 (Ctrl-Enter) at top; beneath is a tab strip with 出力, 入力, コメント and a blue 0 badge; left-aligned column shows numbers 8, 1, 3, 10, 100 on a light background.

この様にスッキリしました。


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

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

今回の例ですと、

for num in array:

等になります。

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

コメントアウトした部分を削除したコードを掲載致します。

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

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

この書き方でも同様の出力結果になりました。


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

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

今回の例ですと、

[print(num) for num in array]

と表記致します。

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

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

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


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

スプレッドシートの出力前の画像です。

入力の所は、paiza側の入力例をコピーして、スプレッドシートに貼り付ける際には[Ctrl]+[Shift]+[V]で貼り付けると書式が崩れなくてスプレッドシートの元の書式を保ったまま綺麗に貼り付けられます。

緑色のセルA2(2,1)に数字の個数N=5を、灰色のセルA3(3,1)の5個の数値を取得し配列arrayに格納、それを加工してC2(2,3)から始まる黄色いセルに出力します。

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

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

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

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

2: 緑色のセルA2(2,1)と灰色のセルA3(3,1)の2行分をまとめて二次元配列numとして取得する


3: 取得したnum
とarrayをログ出力で確認する

4: num[0][0]を数字の個数N=5になるように格納する


5: num[1][0]にsplitメソッドを使って、配列arrayに格納
する

6: 取得した配列arrayをログ出力する


7: スプレッドシート出力用に空の配列array2を宣言して、配列arrayの要素を二次元配列になるようにarray2にループで格納
する

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


9: スプレッドシートのC2(2,3)から始まる黄色いセル5行に数値を格納する

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

const ss = SpreadsheetApp.getActiveSheet();

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

コードを関数「standardInput4」に書いて行きます。

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

function standardInput4() {

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

手順2:緑色のセルA2(2,1)と灰色のセルA3(3,1)の2行分をまとめて二次元配列numとして取得する

num=ss.getRange(2,1,2).getValues();

getRangeの中の(2,1,2)ですが、セルA2が(2,1)です。
また、最後の2は2行分を表しています。
列の1列まで書くと(2,1,2,1)になりますが、1列の場合は省略可能です。

getValuesと複数形になっているのは、2つのセルを取得するので複数形のsが付いています。

function standardInput4() {

  const ss=SpreadsheetApp.getActiveSheet();

  //緑色のセルA2(2,1)と灰色のセルA3(3,1)の2行分をまとめて二次元配列numとして取得する
  const num=ss.getRange(2,1,2).getValues();

}

手順3:取得した配列numをログ出力する

console.log(num);

このコードを実行して、リストnumをログ出力して、セルA2とA3が取得出来たことを確認します。

function standardInput4() {

  const ss=SpreadsheetApp.getActiveSheet();

  //緑色のセルA2(2,1)と灰色のセルA3(3,1)の2行分をまとめて二次元配列numとして取得する
  const num=ss.getRange(2,1,2).getValues();

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

}
UI panel showing two steps labeled in Japanese: 実行開始 (Start execution) and 実行完了 (Execution completed); a code-like line in the middle displaying [[5], ['8 1 3 10 100']].

手順4:num[0][0]を数字の個数Nに格納してログで確認する

const N=num[0][0];

取得した二次元配列のnum[0][0]がA2に当たります。
この配列は、2行1列ですので、A3はnum[1][0]になります。

ここでは、num[0][0]を定数Nに5個として取得するコードと、確認としてその実行結果のログを掲載致します。

function standardInput4() {

  const ss=SpreadsheetApp.getActiveSheet();

  const num=ss.getRange(2,1,2).getValues();
  console.log(num);
  
  //セルA2に該当するnum[0][0]を数値の個数N=5として格納する
  const N=num[0][0];

  //定数Nに数値の個数5個が格納出来たことをログ出力で確認する
  console.log(N);

}
UI panel with '実行開始' at top, a highlighted rounded box containing the number 5, and '実行完了' at bottom.


手順5:num[1][0]にsplitメソッドを使って、配列arrayに格納してログで確認する

const array=num[1][0].split(‘ ‘);

コードと実行結果です。
灰色のセルA3をsplitを使って、半角文字で区切って配列arrayに格納します。

function standardInput4() {

  const ss=SpreadsheetApp.getActiveSheet();

  const num=ss.getRange(2,1,2).getValues();
  console.log(num);
  
  const N=num[0][0];
  console.log(N);

  //num[1][0]にsplitメソッドを使って、配列arrayに格納
  const array=num[1][0].split(' ');

}

手順6:取得した配列arrayをログ出力する

console.log(array);

function standardInput4() {

  const ss=SpreadsheetApp.getActiveSheet();

  const num=ss.getRange(2,1,2).getValues();
  console.log(num);
  
  const N=num[0][0];
  console.log(N);

 
  const array=num[1][0].split(' ');

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

}
配列arrayに分割して格納。splitメソッドを使用

この画像について、最初の配列numではそのまま半角スペース込みで取得されています。

それを今回split(‘ ‘)を使ったことによって、配列arrayには半角スペースで区切られて取得出来たことが確認出来ました。


手順7:スプレッドシートに出力用の空の配列array2を宣言して、二次元配列array2になる様に配列arrayをループで末尾に追加しながら格納する

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

空の配列array2を宣言してそこにpushを使って、arrayの要素をループの中で順番に格納して行きます。

[array[i]]と、array[i]の全体に[ ]で括っているのは、二次元配列として格納してスプレッドシートに出力可能な形式にする為です。

ループの部分では、

for(let i=0;i<N;i++)

ここでは、array2にarrayをループで格納する際に、iの値を0,1,2,3,4と5つ分格納しています。

iの値が変わるので、変数になり let i=0 とループ開始の所でletを用いて宣言をしています。

リストは添字0から始まりますので、iには0から4までの値が代入され、Nは5になりますので、 「 i<N 」となっております。

ここまでのコードです。

function standardInput4() {

  const ss=SpreadsheetApp.getActiveSheet();

  const num=ss.getRange(2,1,2).getValues();
  console.log(num);
  
  const N=num[0][0];
  console.log(N);

  const array=num[1][0].split(' ');
  console.log(array);

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

  //配列arrayを二次元配列array2にループで格納
  for(let i=0;i<N;i++){
    array2.push([array[i]]);
  }

}

この解説よりも、セルA2から個数のNを、セルA3から配列のarrayをそれぞれ取得する方法の方がシンプルです。

しかし、スプレッドシートにアクセスする回数を減らすため、一度に配列numとして取得して、それぞれにN=num[0][0]、array=num[1][0]を代入しました。

どちらも後ろのnumの値が[0]になっているのは、この配列が1列だからです。



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

console.log(array2);

空の配列だったarray2に、スプレッドシートの出力形式に合う二次元配列として数値が格納されたことを下記コードのログで確認します。

function standardInput4() {

  const ss=SpreadsheetApp.getActiveSheet();

  const num=ss.getRange(2,1,2).getValues();
  console.log(num);
  
  const N=num[0][0];
  console.log(N);

  const array=num[1][0].split(' ');
  console.log(array);

  const array2=[];

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

  //スプレッドシートに出力する前に二次元配列array2をログ出力する
  console.log(array2);

}
Output displays a flat list ['8','1','3','10','100'] and a nested list [['8'],['1'],['3'],['10'],['100']], followed by the text '执行完了' meaning Execution completed.

無事にarray2が二次元配列として格納されたことが確認出来ました。


手順9:スプレッドシートのC2(2,3)から始まる黄色いセル5行分にarray2に格納された数値を出力する

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

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

function standardInput4() {

  const ss=SpreadsheetApp.getActiveSheet();

  const num=ss.getRange(2,1,2).getValues();
  console.log(num);
  
  const N=num[0][0];
  console.log(N);

  const array=num[1][0].split(' ');
  console.log(array);

  const array2=[];

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


  console.log(array2);

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

GASは以上です。

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

Python「rstrip() メソッド」で文字列の右端を整えよう!
Python mapの使い方


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

Night view of a large blue circular banner displaying a statue bust, surrounded by colorful LED trees at a festive light show.

よみうりランドのXmasイルミネーションの「ジュエルミネーション」です。

←前の問題へ          次の問題へ→

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

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

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

■ 関連記事 ■

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

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

投稿者アバター
nekosiestr
いつもブログをご覧頂きまして、誠に有難うございます。 Excelやデータベース、プログラミングを学習する傍ら、趣味で写真を撮影してPhotoshopで編集しております。

投稿者: nekosiestr

いつもブログをご覧頂きまして、誠に有難うございます。