この記事を読むことで、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だったらどう解くのか、スプレッドシートでバインドして作ってみました。
問題:
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サンプル
基本情報技術者試験