paiza レベルアップ問題集 標準入力その5「FINAL問題 【整数の半角スペース区切りの入力】1,000個の整数の半角スペース区切りの入力」をPythonとGASの両方で解いたコードの紹介

この記事を読むことで、Pythonの標準入力でsplitメソッドを使って、半角スペース区切りの整数を1,000個に分割して配列に格納して、1,000行の整数を出力する方法の概要が掴めます。

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

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

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

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

【整数の半角スペース区切りの入力】1,000個の整数の半角スペース区切りの入力 (paizaランク D 相当)

問題:

整数 a_1, a_2, … , a_999, a_1000 が半角スペース区切りで与えられるので、改行区切りにして 1000 行で出力してください。

ではまず、Pythonでの解き方とコードです。


手順として、

1:標準入力でsplitメソッドを使って半角スペース区切りの整数をリストで取得する

2:取得したリストをループで出力する

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

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

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

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

数値が1000個と大量ですので、前半と後半の画像に分けて掲載致します。

<入力例1_前半>

<入力例1_後半>

下記のコードで入力と出力を行いますが、1行に複数の関数が使われているので、今回の例に即して簡潔にお伝えします。

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

split … 指定の区切り文字で分割して取得する

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


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


map … 関数をまとめて適用


list … リスト(配列)変換

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

#1000個の整数を標準入力で取得し右側の不要な空白を削除して分割してリストにする
array=list(map(int,input().rstrip().split(' ')))

#arrayが配列として取得できたことを確認する
print(array)

まずは、リストとして出力出来ました。

<リスト_前半>

<リスト_後半>

では、リストarrayをループを用いて解答の出力例に沿って縦に出力します。

ループを用いる前にリストarrayの長さを調べて、リストは0からarray[0]、array[1] …array[998],array[999]になるので後ほどループの回数に使用する、リストarrayの長さが1000(0,1,2 ……. ,998,999までの1000回)になることを、len関数を用いて確認します。

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

#リストの長さを求める
print(len(array))

このコードで、リストarrayの長さが1000であることが確認出来ました。

では、リストarrayをループで出力します。

for i in range(len(array)):

これで、iに0,1,2,3, … 997,998,999が入ります。
range(数)で、0からその数(1,000)未満の回数分ループを回します。

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

#ループを使ってリストを出力
for i in range(len(array)):
    print(array[i])

リストをループを使って出力した結果の画像です。

ループでリストを出力_前半>

ループでリストを出力_後半>

必要な分だけ出力するので、コメントアウトを致します。

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

#print(len(array)) ←コメントアウト

#ループを使ってリストを出力
for i in range(len(array)):
    print(array[i])

すると、解答提出に必要な分だけ出力されました。


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

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

今回の例ですと、

for num in array:

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

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

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

#リスト出力に便利なループの書き方
for num in array:
    print(num)

更にコード短くするのに、内包表記を用います。

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

今回の例ですと、

[print(num) for num in array]

と表記いたします。

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

#リスト出力に便利なループの書き方の内包表記
[print(num) for num in array]

このコードの実行(出力)結果です。

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


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

paizaの入力例1をコピーして、緑色のセルA2に[Ctrl] + [Shift] + [V] で貼り付けると書式を保って貼り付けられます。

とは言え、セルA2からはみ出してしまっているので、「切り詰める」ボタンを押して整えます。

すると、

このように多少スッキリした見栄えになりました。
A列の列幅を少し狭くしました。

また、スプレッドシートの出力をスクロールして後半部分を表示するので、1行目で行固定しています。

1行目の行の左端の「1」をクリックすると行全体が選択出来るので、「表示」→「固定」→「行1まで」を選択しました。

緑色のセルA2(2,1)に入力した1,000個の整数を取得して、それをC2(2,3)から始まる黄色いセル1,000行分に出力します。

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

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

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

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

2:緑のセルA2(2,1)の整数をsplitメソッドを使って配列arrayに格納する

3:配列arrayをログ出力して、数値が格納出来たことを確認する。

4:スプレッドシートに格納する為に、空の配列array2を宣言してarrayの数値をループで二次元配列になる様に追加して格納する

5:スプレッドシートに出力する前に、array2をログ出力する

6:スプレッドシートのC2(2,3)から始まる黄色い所に1,000行分出力する

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

const ss = SpreadsheetApp.getActiveSheet();

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

このコードを「standardInput5」の中に書いていきます。

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

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

}

手順2:緑のセルA2(2,1)の整数をsplitメソッドを使って配列arrayに格納する

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

function standardInput5() {

  const ss=SpreadsheetApp.getActiveSheet();

  //緑のセルの整数をsplitメソッドを使って配列arrayに格納する
  const array=ss.getRange(2,1).getValue().split(' ');

}

手順3:配列arrayをログ出力して、数値が格納出来たことを確認する。

console.log(array);

1,000個は多すぎて全部ログ出力出来なかったので一部のみの画像です。

手順4:スプレッドシートに出力用の空の配列array2を宣言して、ループでarrayの数値をarray2に二次元配列になる様に格納する

まず、出力用の二次元配列にする空の配列array2を宣言します。
また、一次元配列arrayは量が多いのでコメントアウトしています。

function standardInput5() {

  const ss=SpreadsheetApp.getActiveSheet();
  const array=ss.getRange(2,1).getValue().split(' ');
  //console.log(array); ←コメントアウト

  //スプレッドシート出力用の二次元配列にするarray2を宣言
  const array2=[];

}

ループを用いてarrayの要素を一つずつarray2に二次元配列として追加します。

for(let i=0;i<array.length;i++)

配列は添字が0から始まるのでarray[i]である、array[0]、array[1] …. array[998]、array[999]をarray2に格納します。

array[i]のiを一つずつインクリメント(増加)する為、iの値は変わっていくので let i=0 として変数にしています。

i<array.lengthは、array.lengthが1,000ですので、スタートが0の場合はゴールが999になり、「<」を用いています。イコールは付けないのはその為です。

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

ループの中で、pushを使ってarray2の末尾にドンドンarrayの要素を追加しています。
[array[i]]とarrayの配列全体を[ ]で括っているのは、二次元配列として追加する為です。

function standardInput5() {

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

  const array2=[];

  //ループを用いて一次元配列arrayの要素をarray2に二次元配列になる様に格納する
  for(let i=0;i<array.length;i++){
    array2.push([array[i]]);
    
  }
}

手順5:スプレッドシートに格納前に、array2をログ出力する

console.log(array2);

量が多いので一部のみですが、空の配列だったarray2が二次元配列として格納されたことを確認出来ました。

function standardInput5() {

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

  const array2=[];

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

  //スプレッドシートに出力する前に、array2が二次元配列になっていることをログ出力で確認する
  console.log(array2);

}

出力結果です。

手順6:スプレッドシートのC2から始まる黄色いセル1,000行分に格納する

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

C2は(2,3)で、行数1,000はarray2.lengthの配列の長さが使えます。
(2,3,1000)と(2,3,array2.length)は同意です。
列数1の分(2,3,1000,1)の1は省略可能です。

元の数値を分割して配列に格納したので数値は複数になり、setValuesはsが付く複数形です。

function standardInput5() {

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

  const array2=[];

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

  console.log(array2);

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

}

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

<出力結果_前半>

<出力結果_後半>

GASは以上です。

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

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


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

マクセルアクアパーク品川の水槽を泳ぐ涼しげ魚たちです。

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

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

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

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

■ 関連記事 ■

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

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

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

投稿者: nekosiestr

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

モバイルバージョンを終了