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

この記事を読むことで、Pythonで標準入力とsplitメソッドなどを用いて、数値の個数と、全ての数値をリスト(配列)に格納して、ループで出力することが可能になります。

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

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

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

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

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


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

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

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


手順として、

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

2: 2行目は標準入力と幾つかのメソッドを使って、N個の整数を全てリストarrayに格納する


3: 格納したリストの要素をループで出力する

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

手順として、

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

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

入力例1
6
6561 3785 6338 9568 4956 557

出力例1
6561
3785
6338
9568
4956
557

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

まずは1行目の数値の個数6個を標準入力で取得して、変数Nに代入してその結果を確認します。

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

#数値の個数6個がNに代入されたことを確認する
print(N)

出力結果の画像です。

次に2行目の6個の数値を標準入力で取得してリストarrayに格納します。

それをリストの形に変換して、コード1行に複数の関数を使用しているので、今回の例に即して簡潔にお伝えします。

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

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

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


map … 関数をまとめて適用


list … リスト(配列)変換

上記の関数を用いてコードを掲載致します。

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

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

#6個の半角スペース区切りの数値をリストに変換してarrayに格納す
array=list(map(int,input().split(' ')))

#arrayに6つの数値が格納されたことを確認する
print(array)

無事に、arrayにリストとして6つの整数が格納されました。
このリストの数値をループで縦に出力します。

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

for i in range(N):

N=int(input())
print(N)#確認用のprint文…後で消す

array=list(map(int,input().split(' ')))
print(array)#確認用のprint文…後で消す

#ループをN=6回回わして、順番にリストの数値を出力する
for i in range(N):
    print(array[i])

少し、確認用に出力した分が見辛くなって来ましたので、ここでNやarrayの確認用に使ったprint文を削除します。

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

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


#ループをN=6回回わして、順番にリストの数値を出力する
for i in range(N):
    print(array[i])


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

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

今回の例ですと、

for num in array:

になります。

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

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


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

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

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

今回の例ですと、

[print(num) for num in array]

とループが1行のコードで出力可能になります。

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

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

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


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

A列に入力例1を貼り付ける際、paizaの入力例1をコピーして、[Ctrl] + [Shift] + [V] で貼り付けると書式を崩さずに貼り付けられます。

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

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

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

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

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

2:緑のセルA2(2,1)にある整数の個数を取得して定数Nに代入する


3:灰色のセルA3(3,1)をsplitメソッドで空白による分割をして配列arrayに格納


4:取得したarrayをログ出力する


5:スプレッドシートに出力する為、空の配列array2を用意して、二次元配列としてarrayの要素をループを用いてarray2に格納する


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


7:C2(2,3)からN=6行分をスプレッドシートの黄色い所に出力する


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

const ss = SpreadsheetApp.getActiveSheet();

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

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

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

function standardInput2() {

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

}

手順2:緑のセルA2(2,1)にある数値の個数Nを取得して6個の6が取得出来たことを確認

const N=ss.getRange(2,1).getValue();

function standardInput2() {

  const ss=SpreadsheetApp.getActiveSheet();

  //緑のセルA2にある数値の個数を定数Nに取得
  const N=ss.getRange(2,1).getValue();

  //Nを出力して確認
  console.log(N);

}

手順3:灰色のセルA3(3,1)splitメソッドで空白による分割をして配列arrayに格納

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

function standardInput2() {

  const ss=SpreadsheetApp.getActiveSheet();

  const N=ss.getRange(2,1).getValue();
  console.log(N);

  //灰色のセル1列をsplitメソッドで空白による分割をして配列arrayに取得
  const array=ss.getRange(3,1).getValue().split(' ');

}


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

console.log(array);

コードと実行結果です。

function standardInput2() {

  const ss=SpreadsheetApp.getActiveSheet();

  const N=ss.getRange(2,1).getValue();
  console.log(N);

  const array=ss.getRange(3,1).getValue().split(' ');

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

}

arrayには数値がこのような一次元配列として格納されたことが確認出来ました。


手順5:スプレッドシート出力用の空の配列array2を用意して、ループを用いてarrayからarray2に二次元配列として格納する

ここで、ループを使用して、arrayの配列の要素をarray2にpushを使って追加していきます。

その際、[array[i]]と配列全体に[ ]で括っています。

また、ループでは配列が添字0から始まるため、i=0が開始の値で、i<array.lengthとすることで、iの値が0,1,2,3,4,5と長さ6つ分変化していきます。

注意点として、arrayの長さが6でiが0から始まるため、i<array.lengthと「<」を使っています。

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

function standardInput2() {

  const ss=SpreadsheetApp.getActiveSheet();

  const N=ss.getRange(2,1).getValue();
  console.log(N);

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


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

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

}


手順6:スプレッドシート出力前にarray2に二次元配列として格納できたことをログ出力で確認する

console.log(array2);

function standardInput2() {

  const ss=SpreadsheetApp.getActiveSheet();

  const N=ss.getRange(2,1).getValue();
  console.log(N);

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


  
  const array2=[];

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

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

}

これで、array2が二重カッコになっていることから、二次元配列として格納されたことが確認出来ました。

この形になって初めてスプレッドシートに出力出来ます。


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

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

C2が(2,3)であり、そこから6行分のNで(2,3,N)、1列分で(2,3,N,1)になりますが、列の1は省略可能です。

また、数値の個数分がarray2に格納されて6個と複数個ですので、setValuesと複数形のsを付けます。

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

function standardInput2() {

  const ss=SpreadsheetApp.getActiveSheet();

  const N=ss.getRange(2,1).getValue();
  console.log(N);

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

  const array2=[];

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

  console.log(array2);


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

}

GASは以上です。

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

Python mapの使い方


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

いたばし花火大会(東京都板橋区)です。

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

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

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

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

■ 関連記事 ■

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

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