この記事を読むことで、PythonとGASでforループを使って最小値を求められます。
Pythonでは計算結果を新たなリストに追加してmin関数でその最小値を求め、GASでは仮の最小値ans=201をループの中で更新して行って最小値を求めます。
このコーナーでは、学習コンテンツ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 を足したとき、N 個の整数の最小値を出力してください。
この記事では、下記の入力例1の場合を例にして、標準入力でリストの要素数N=5とリストを取得して、リストの中の数字と添字の合計を別の配列に格納して、最大値を求めます。
入力例1
5
1 2 3 4 5
出力例1
2
ではまず、Pythonで解いてみます。
今回は、paiza.ioを使って解きます。paiza.ioの使い方はこちらから。
■ Pythonでの解き方 ■
下準備として、paiza.ioにこの様に入力します。
(入力例1をそのままioにコピーしただけ。)
手順として、
1:Nを標準入力で取り込む
2:リストarrayを標準入力で取り込む
3:リストarray内の数字と添字を合計した数を格納する配列sumArrayを宣言する
4:ループを使ってリストarrayの数値と添字を合計して配列sumArrayに追加する
5:sumArrayの最小値をmin関数を使って求める
で、行います。
リストの添字は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に追加された
リストsumArrayから求まった最小値です。
ここまでのトレースのコードです。
#Nを標準入力で取り込む
N=int(input())
#リストarrayを標準入力で取り込む
array=list(map(int,input().rstrip().split(' ')))
#リストarray内の数字と添字を合計した数を格納する配列sumArrayを宣言する
sumArray=[]
#ループを使ってリストarrayの数値と添字を合計して配列sumArrayに追加する
for i,num in enumerate(array):
print('追加前のリストsumArray:'+str(sumArray))
print('sumArrayに「'+str(num)+'」とi:'+str(i)+'+1=「'+str(i+1)+'」の【'+str(num+i+1)+'】を追加する')
sumArray.append(num+i+1)
print('追加後のリストsumArray:'+str(sumArray))
print('-------------------------------------------')
#sumArrayの最小値をmin関数を使って求める
print(min(sumArray))
このままでは、出力結果である出力例1に対して冗長なコードが含まれているので、解答以外のprint文をコメントアウトします。
#Nを標準入力で取り込む
N=int(input())
#リストarrayを標準入力で取り込む
array=list(map(int,input().rstrip().split(' ')))
#リストarray内の数字と添字を合計した数を格納する配列sumArrayを宣言する
sumArray=[]
#ループを使ってリストarrayの数値と添字を合計して配列sumArrayに追加する
for i,num in enumerate(array):
#print('追加前のリストsumArray:'+str(sumArray))
#print('sumArrayに「'+str(num)+'」とi:'+str(i)+'+1=「'+str(i+1)+'」の【'+str(num+i+1)+'】を追加する')
sumArray.append(num+i+1)
#print('追加後のリストsumArray:'+str(sumArray))
#print('-------------------------------------------')
#sumArrayの最小値をmin関数を使って求める
print(min(sumArray))
スッキリするように、コメントアウトした部分を省いたコードです。
#Nを標準入力で取り込む
N=int(input())
#リストarrayを標準入力で取り込む
array=list(map(int,input().rstrip().split(' ')))
#リストarray内の数字と添字を合計した数を格納する配列sumArrayを宣言する
sumArray=[]
#ループを使ってリストarrayの数値と添字を合計して配列sumArrayに追加する
for i,num in enumerate(array):
sumArray.append(num+i+1)
#sumArrayの最小値をmin関数を使って求める
print(min(sumArray))
ioの出力結果です。
■ GASでの解き方 ■
では、同じ問題をGASで解いてみます。
まず、スプレッドシートにこの様に配置しました。
スプレッドシートの緑のセルに配列の数の整数5を入力しました。
灰色のセルには配列を入力しました。
黄色いセルには配列の値とその添字に1を加えた値のうちの最小値を出力します。
(配列の添字は0から始まるため)
※スプレッドシートに表示する場合は、二次元配列としてからの配列に追加をして作成します※
手順はこのようになります。
1:スプレッドシートからアクティブシートにアクセスする
2:スプレッドシートの緑のセルから整数N(この例の場合は5)を取得する
3:スプレッドシートの灰色のセルから配列を取得する
4:配列が取得出来たことを確認するために出力する
5:仮の最小値として変数ansを201で初期化する
6:ループ内で使う合計の計算結果を保存する変数tempを宣言する
7:ループ内で「i+1」とarray[0][i]を計算して変数tempに代入。
tempが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を201で初期化する
let ans=201;
手順6:ループ内で使う合計の計算結果を保存する変数tempを宣言する
let temp;
手順7:ループ内で「i+1」とarray[0][i]を計算して変数tempに代入。
tempが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]を計算して変数tempに代入。
//tempがansよりも小さかったらtempをansに代入する
for (let i=0;i<N;i++){
console.log(`現在の最小値ans:${ans}`);
console.log(`i:${i}、i+1=「${i+1}」+array[0][${i}]:「${array[0][i]}」の計算結果をtempに格納`);
temp=i+1+array[0][i];
console.log(`temp:【${temp}】`);
if(temp<ans){
ans=temp;
console.log(`ansを${temp}で更新しました。`);
}
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 loop2no17(){
//スプレッドシートからアクティブシートにアクセスする
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を201で初期化する
let ans=201;
//ループ内で使う合計の計算結果を保存する変数tempを宣言する
let temp;
console.log('<<<ループに入る>>>');
//ループ内で「i+1」とarray[0][i]を計算して変数tempに代入。
//tempがansよりも小さかったらtempをansに代入する
for (let i=0;i<N;i++){
console.log(`現在の最小値ans:${ans}`);
console.log(`i:${i}、i+1=「${i+1}」+array[0][${i}]:「${array[0][i]}」の計算結果をtempに格納`);
temp=i+1+array[0][i];
console.log(`temp:【${temp}】`);
if(temp<ans){
ans=temp;
console.log(`ansを${temp}で更新しました。`);
}
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);
}
宜しかったらコピペしてアレンジして見て下さい。
お疲れ様でした、ブレイクタイムフォトはこちらになります。
新緑の水元公園2018年ゴールデンウィーク撮影
■ 参考文献の紹介■
じっくり丁寧にPythonを学びたい方向け。
まずはpaizaラーニングなどの学習コンテンツで学んで、基礎をマスターしたら、この本でじっくりと初級から中級レベルを目指せます。
初めてGASを学ぶ方向け。
スプレッドシートの基本的な使い方からGASのベースとなるJavaScriptの基礎文法、GASでの初歩的なプログラミングを学べます。
GASに少し慣れて来たら、基礎固めとリファレンスとしてこの本でじっくり学べます。
paizaレベルアップ問題集でPythonとGASを解いて見たに戻る
メインメニューに戻る
Python自作サンプル
GASサンプル
基本情報技術者試験