paiza レベルアップ問題集 「STEP: 11 加算された数列の最大値」をPythonとGASで解いてみた

この記事を読むことで、PythonとGASでforループを使って最大値を求められます。
Pythonでは計算結果を新たなリストに追加してmax関数でその最大値を求め、GASでは仮の最大値ans=0をループの中で更新して行って最大値を求めて行きます。

このコーナーでは、学習コンテンツpaizaラーニングレベルアップ問題集をPythonとGASの両方で解いて全コードの解説をしています。
PythonとGASの両方のコードを用いて、全コード及び部分的にも可能な限り詳細に記載いたしました。

GASはスプレッドシートを使っています。
GASはGoogle Apps Scriptと言って、JavaScriptの文法をベースにしているので、JavaScriptの学習中の方にもお役立て出来るかも知れません。

サイトマップはこちらから

paizaレベルアップ問題集でPythonとGASを解いて見たに戻る
メインメニューに戻る
Python自作サンプル
GASサンプル
基本情報技術者試験

paizaでの解答はPythonで行いましたが、この記事ではPythonのコードと共に、同じ問題を現在学習中のGASだったらどう解くのか、スプレッドシートでバインドして作ってみました。

加算された数列の最大値 (paizaランク D 相当)

問題:
N 個の整数 a_1, a_2, …, a_N が与えられます。
a_i に i を足したとき、a_1 , … , a_N の最大値を出力してください。

この記事では、下記の入力例1の場合を例にして、標準入力でリストの要素数N=5とリストを取得して、リストの中の数字と添字の合計を別の配列に格納して、最大値を求めます。

入力例1
5
1 2 3 4 5

出力例1
10

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

今回は、paiza.ioを使って解きます。paiza.ioの使い方はこちらから。

■ Pythonでの解き方 ■

下準備として、paiza.ioにこの様に入力します。
(入力例1をそのままioにコピーしただけ。)

手順として、

1:Nを標準入力で取り込む

2:リストarrayを標準入力で取り込む


3:リストarray内の数字と添字を合計した数を格納する配列sumArrayを宣言する


4:ループを使ってリストarrayの数値と添字を合計して配列sumArrayに追加する


5:sumArrayの最大値をmax関数を使って求める

で、行います。

リストの添字は0から始まる為、「i+1」と1を加えています。

リストはこちらになります。

では、ループのトレースを行います。

i=0の時

array[0]=1とi+1=1を合計して計算結果2がsumArrayに追加された

i=1の時

array[1]=2とi+1=2を合計して計算結果4がsumArrayに追加された

i=2の時

array[2]=3とi+1=3を合計して計算結果6がsumArrayに追加された

i=3の時

array[3]=4とi+1=4を合計して計算結果8がsumArrayに追加された

i=4の時

array[4]=5とi+1=5を合計して計算結果10がsumArrayに追加された

ループを抜けた後に、max関数を使っって、sumArrayの最大値を出力した結果です。

ここまでのトレースのコードです。

#Nを標準入力で取り込む
N=int(input())

#リストarrayを標準入力で取り込む
array=list(map(int,input().rstrip().split(' ')))

#リストarray内の数字と添字を合計した数を格納する配列sumArrayを宣言する
sumArray=[]

print("リスト:"+str(array)+'\n')

#ループを使ってリストarrayの数値と添字を合計して配列sumArrayに追加する
print('<<<ループに入る>>>')
for i,num in enumerate(array):
    print("array["+str(i)+"]"+"である「"+str(num)+"」と、添字i+1="+str(i+1)+"を合計して配列の末尾に追加する")
    sumArray.append(num+i+1)
    print("現在の配列:"+str(sumArray))
    print('----------------------------------------------')
print('<<<ループを抜けた>>>')

#sumArrayの最大値をmax関数を使って求める
print(max(sumArray))

このままでは、出力結果である出力例1に対して冗長なコードが含まれているので、解答以外のprint文をコメントアウトします。

#Nを標準入力で取り込む
N=int(input())

#リストarrayを標準入力で取り込む
array=list(map(int,input().rstrip().split(' ')))

#リストarray内の数字と添字を合計した数を格納する配列sumArrayを宣言する
sumArray=[]

#print("リスト:"+str(array)+'\n')

#ループを使ってリストarrayの数値と添字を合計して配列sumArrayに追加する
#print('<<<ループに入る>>>')
for i,num in enumerate(array):
    #print("array["+str(i)+"]"+"である「"+str(num)+"」と、添字i+1="+str(i+1)+"を合計して配列の末尾に追加する")
    sumArray.append(num+i+1)
    #print("現在の配列:"+str(sumArray))
    #print('----------------------------------------------')
#print('<<<ループを抜けた>>>')

#sumArrayの最大値をmax関数を使って求める
print(max(sumArray))  

スッキリするように、コメントアウトした部分を省いたコードです。

#Nを標準入力で取り込む
N=int(input())

#リストarrayを標準入力で取り込む
array=list(map(int,input().rstrip().split(' ')))

#リストarray内の数字と添字を合計した数を格納する配列sumArrayを宣言する
sumArray=[]

for i,num in enumerate(array):
    sumArray.append(num+i+1)

#sumArrayの最大値をmax関数を使って求める
print(max(sumArray))

ioの出力結果です。

■ GASでの解き方 ■

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

スプレッドシートの緑のセルに配列の数の整数5を入力しました。
灰色のセルには配列を入力しました。
黄色いセルには配列の値とその添字に1を加えた値のうちの最大値を出力します。
(配列の添字は0から始まるため)

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

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

1:スプレッドシートからアクティブシートをアクセスする

2:スプレッドシートの緑のセルから整数N(この例の場合は5)を取得する

3:スプレッドシートの灰色のセルから配列を取得する

4:配列が取得出来たことを確認するために出力する

5:仮の最大値として変数ansを0で初期化する

6:ループ内で使う合計の計算結果を保存する変数tempを宣言する

7:ループ内で「i+1」とarray[0][i]を計算してansよりも大きかったらtempをansに代入する

8:ループを抜けてansに最大値が求まったことをログで確認する

9:ansを二次元配列として取得するans2を宣言して、ansを追加する

10:スプレッドシートに出力前にans2をログ出力して確認する

11:スプレッドシートの黄色い所に最大値の二次元配列ans2を出力する

手順1: スプレッドシートからアクティブシートをアクセスする

const ss=SpreadsheetApp.getActiveSheet();

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

手順2:スプレッドシートの緑のセルから整数N(この例の場合は5)を取得する

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

手順3:スプレッドシートの灰色のセルから配列を取得する

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

手順4:配列が取得出来たことを確認するために出力する

console.log(array);

手順5:仮の最小値としてansを0で初期化する

let ans=0;

手順6:ループ内で使う合計の計算結果を保存する変数tempを宣言する

let temp;

手順7:ループ内で「i+1」とarray[0][i]を計算してansよりも大きかったらtempをansに代入する

スプレッドシートでは二次元配列として取得されるので、array[0][i]と書いています。
また、配列は添字が0から始まるので「i+1」をしています。

i=0の時

array[0]=1とi+1=1を合計して計算結果:temp=2になった。
temp>ansなので、ansの値を更新した。

i=1の時

array[1]=2とi+1=2を合計して計算結果:temp=4になった。
temp>ansなので、ansの値を更新した。

i=2の時

array[2]=3とi+1=3を合計して計算結果:temp=6になった。
temp>ansなので、ansの値を更新した。

i=3の時

array[3]=4とi+1=4を合計して計算結果:temp=8になった。
temp>ansなので、ansの値を更新した。

i=4の時

array[4]=5とi+1=5を合計して計算結果:temp=10になった。
temp>ansなので、ansの値を更新した。

console.log('<<<ループに入る>>>');
  //ループ内で「i+1」とarray[0][i]を計算してansよりも大きかったらtempをansに代入する
  for(let i=0;i<N;i++){
    console.log(`i:「${i+1}」+array[0][${i}]:「${array[0][i]}」を計算する`);
    temp=(i+1)+array[0][i];
    console.log(`tempの計算結果${temp}`);
    if(temp>ans){
      ans=temp;
      console.log(`現在の最大値は${ans}です。`);
    }
    console.log('------------------');
  }
  console.log('<<<ループを抜けた>>>');

手順8:ループを抜けてansに最大値が求まったことをログで確認する

console.log(ans);

手順9:ansを二次元配列として取得するans2を宣言して、ansを追加する

let ans2=[];
ans2.push([ans]);

手順10:スプレッドシートに出力前にans2をログ出力して確認する

console.log(ans2);

手順11:スプレッドシートの黄色い所に最大値の二次元配列ans2を出力する

ss.getRange(4,2).setValue(ans2);

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

GASでの全コードはこちらになります。

function loop2no16(){

  //スプレッドシートからアクティブシートにアクセスする
  const ss=SpreadsheetApp.getActiveSheet();

  //スプレッドシートの緑のセルから整数N(この例の場合は5)を取得する
  const N=ss.getRange(1,2).getValue();

  //スプレッドシートの灰色のセルから配列を取得する
  const array=ss.getRange(2,2,1,N).getValues();

  //配列が取得出来たことを確認するために出力する
  console.log(array);
  
  //仮の最小値としてansを0で初期化する
  let ans=0;

  //ループ内で使う合計の計算結果を保存する変数tempを宣言する
  let temp;


  console.log('<<<ループに入る>>>');
  //ループ内で「i+1」とarray[0][i]を計算してansよりも大きかったらtempをansに代入する
  for(let i=0;i<N;i++){
    console.log(`i:「${i+1}」+array[0][${i}]:「${array[0][i]}」を計算する`);
    temp=(i+1)+array[0][i];
    console.log(`tempの計算結果${temp}`);
    if(temp>ans){
      ans=temp;
      console.log(`現在の最大値は${ans}です。`);
    }
    console.log('------------------');
  }
  console.log('<<<ループを抜けた>>>');

  //ループを抜けてansに最大値が求まったことをログで確認する
  console.log(ans);

  //ansを二次元配列として取得するans2を宣言して、ansを追加する
  let ans2=[];
  ans2.push([ans]);

  //スプレッドシートに出力前にans2をログ出力して確認する
  console.log(ans2);

  //スプレッドシートの黄色い所に最大値の二次元配列ans2を出力する
  ss.getRange(4,2).setValue(ans2);

}

宜しかったらコピペしてアレンジして見て下さい。
お疲れ様でした、ブレイクタイムフォトはこちらになります。

谷根千のまねきねこ(=^x^=)

■ 参考文献の紹介■

じっくり丁寧にPythonを学びたい方向け。
まずはpaizaラーニングなどの学習コンテンツで学んで、基礎をマスターしたら、この本でじっくりと初級から中級レベルを目指せます。

初めてGASを学ぶ方向け。
スプレッドシートの基本的な使い方からGASのベースとなるJavaScriptの基礎文法、GASでの初歩的なプログラミングを学べます。

GASに少し慣れて来たら、基礎固めとリファレンスとしてこの本でじっくり学べます。

サイトマップはこちらから

paizaレベルアップ問題集でPythonとGASを解いて見たに戻る
メインメニューに戻る
Python自作サンプル
GASサンプル
基本情報技術者試験

←前に戻る         次に進む→

投稿者: nekosiestr

プログラミング学習中のロスジェネ(就職氷河期世代)の発達障害者です。 宜しくお願いします。 趣味で写真を撮っています。 プログラミングは、GAS/HTML/CSS/JavaScript/jQuery/PHP、 発達障害は、自閉症スペクトラムASD/ADHD、その他双極性障害やHSP(5人に1人の繊細さん)などの生きづらさを抱えておりますが、それでも楽しく生きて行きたいです!! 写真は、以前はコンパクトデジカメ、現在は、OLYMPUSミラーレス一眼を使っています。