paiza レベルアップ問題集 標準入力その7「STEP: 1 改行区切りでの N 個の文字列の入力」をPythonとGASの両方で解いたコードの紹介

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

GASではスプレッドシートで値を取得して、二次元配列になっていることを確認してから出力をしています。

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

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

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

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


改行区切りでの N 個の文字列の入力 (paizaランク D 相当)

問題:
1 行目に整数 N が与えられます。
2 行目以降に、N 個の文字列 s_1, … , s_N が N 行で与えられます。
s_1, … , s_N を改行区切りで出力してください。

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


手順として、

1: 1行目の文字列の個数5個を標準入力で整数として取得して、変数Nに代入する

2: 2行目からN(=5)個の文字列をループの中で標準入力を用いてprint文で出力する

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

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

入力例1
5
hello
paiza
813
paiza2020
Nice

出力例1
hello
paiza
813
paiza2020
Nice

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

まず、1行目の文字列の個数5を変数Nに標準入力で取得します。

N=int(input())

intの中にinputを入れることで、整数として取得します。

#1行目の文字列の個数5を標準入力で整数として取得して変数Nに代入する
N=int(input())

#変数に取得できたことを出力して確認
print(N)

無事に文字列の個数5が変数Nに取得出来たことをprint文で出力した結果の画像です。


次に、ループを用いて5つの文字列を出力します。

for i in range(N):

今、Nに5が入っている状態です。

rangeの中にNを入れると、0から5未満の繰り返しが行われますので、iの動きは下記の様になります。

i=0
i=1
i=2
i=3
i=4

の5回分ループを回します。

temp=input()

ループの中で変数tempに標準入力で取得した文字を代入します。

このtempという変数は仮に、一時的に入れる箱として便利な変数名です。
その後、tempを出力しています。

tempには、文字列hello 〜 Nice までの5つの文字列を仮に入れて置く箱みたなものです。

N=int(input())
#print(N) ← コメントアウト

#2行目の文字列からN=5個の文字列を出力する
for i in range(N):
    temp=input()
    print(temp)

このコードの出力結果です。

Pythonは以上です。

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


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

スプレッドシートの文字揃えは、A列とC列の文字列部分を右揃えに統一しております。

緑色のセルA1(1,1)と、その下の灰色のセルに5個の文字列を貼り付けました。

paiza側の入力例1をコピーした後にスプレッドシート側で[Ctrl] + [Shift] + [V] のショートカットキーで貼り付けると元の書式を崩さずに綺麗に貼り付けられます。

灰色のセルA2から始まる5個の文字列の個数をN個として、文字列をC2(2,3)から始まる黄色いセルN=5行分出力します。

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

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

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

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

2: 緑色のセルA1から下の灰色の5行の文字列を含めた6行分を配列arrayに取得
(この時点で二次元配列になっている)

3: 先頭のarray[0][0]を文字列の個数Nに代入


4: ShiftメソッドでNに代入した先頭の要素を配列arrayから取り除く


5: 文字列のみが残った配列arrayをスプレッドシートのセルC2(3,2)から始まる黄色いセル5行分に出力する

以上の手順で進めて参ります。


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

const ss = SpreadsheetApp.getActiveSheet();

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

関数「standardInput1」の中にコードを書いていきます。

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

function standardInput1() {

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

}


手順2:緑色のセルA1(1,1)から灰色のセルの文字列5つを合わせて、合計6行分を取得する

const array=ss.getRange(1,1,6).getValues();

文字列は複数になりますので、getValuesとsが付く複数形になります。

function standardInput1() {

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

  //緑色のセルA1から6行分(文字列の個数5と文字列自体の行の合計6行分)を配列arrayに取得
  const array=ss.getRange(1,1,6).getValues();

}

また、arrayは二次元配列として取得されます。
ログで確認致します。

function standardInput1() {

  const ss=SpreadsheetApp.getActiveSheet();
  const array=ss.getRange(1,1,6).getValues();

  //arrayが二次元配列として取得されたことを確認する
  console.log(array);

}

実行結果によりarrayが二次元配列として取得出来たことが確認出来ました。

この配列の構成は、配列の添え字は0から始まりますので、

array[0][0]=5
array[1][0]=hello
array[2][0]=paiza
array[3][0]=813
array[4][0]=paiza2020

array[5][0]=Nice

の、6行1列配列として配列arrayが取得出来ました。


手順3:先頭のarray[0][0]を文字列の個数Nに代入

const N=array[0][0];

下記のコード実行後にN=5となっていることがログで確認出来ます。

function standardInput1() {

  
  const ss=SpreadsheetApp.getActiveSheet();
  const array=ss.getRange(1,1,6).getValues();
  console.log(array);

  //array[0][0]を文字列の個数として定数Nに代入する
  const N=array[0][0];

  //Nに文字列の個数5が代入されたことを確認する
  console.log(N);

}

手順4:ShiftメソッドでNに代入した先頭の要素array[0][0]を配列arrayから取り除く

array.shift();

下記のコードと実行結果で、文字数の個数である先頭の5が配列arrayから取り除けたことが確認出来ました。

function standardInput1() {
  
  const ss=SpreadsheetApp.getActiveSheet();
  const array=ss.getRange(1,1,6).getValues();
  console.log(array);

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

  //Nに代入した配列の先頭の要素をshiftを使って配列arrayから削除
  array.shift();

  //先頭の文字数5が削除されたことを確認
  console.log(array);

}

この画像から配列arrayが単語5つのみであり、尚且つarrayが既に二次元配列になっていることが確認出来ましたので、このままスプレッドシートの黄色いセルに貼り付ける処理に進めます。


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

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

getRangeの中でセルC2である(2,3)と行数分の5が入っているNが使われています。
単語数が5つですので、複数形でsetValuessが付いています。

1列ですので、(2,3,N,1)と列数も指定出来ますが、1列の場合は省略可能です。
コードと実行後のスプレッドシートです。

function standardInput1() {
  
  const ss=SpreadsheetApp.getActiveSheet();
  const array=ss.getRange(1,1,6).getValues();
  console.log(array);

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

  array.shift();
  console.log(array);
  
  //スプレッドシートのセルC2(2,3)から始まる黄色いセルに配列arrayを出力する
  ss.getRange(2,3,N).setValues(array);

}


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

梅雨の時期に代々木公園で撮影した紫陽花です。

←標準入力その6へ          次の問題へ→

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

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

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

■ 関連記事 ■

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


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