この記事を読むと、PythonでのIF文・Forループの基本的な書き方と、max関数をprint文の中で使って最大値を求める方法を学べます。
また、ループの中で値がどう変化していくのか、トレースの練習になるコードもPython、GASの両方で掲載しています。
このコーナーでは、学習コンテンツpaizaラーニングのレベルアップ問題集をPythonとGASの両方で解いて全コードの解説をしています。
PythonとGASの両方のコードを用いて、全コード及び部分的にも可能な限り詳細に記載いたしました。
GASはスプレッドシートを使っています。
GASはGoogle Apps Scriptと言って、JavaScriptの文法をベースにしているので、JavaScriptの学習中の方にもお役立て出来るかも知れません。
問題:長さ N の数列 a (a_1, a_2, …, a_N) が与えられます。
この数列の最大値を出力してください。
この記事では、入力例1でNにリスト長さが5、リストに「1 2 3 4 5」にが与えられたという条件で解いて行きます。
入力例1
5
1 2 3 4 5
出力例1
5
ではまず、Pythonで解いてみます。
今回は、paiza.ioを使って解きます。paiza.ioの使い方はこちらから。
<<Pythonでの解き方>>
下準備として、paiza.ioにこの様に入力します。
手順として、
1:標準入力でNを取得
2:標準入力でリストを取得
3:仮の最大値ansを0で初期化して宣言
4:ループとIFで最大値を比較しながら代入
5:ループを回しながら【現在の最大値】を出力してトレース
6:最大値ansを出力
まずは、仮の最大値ansを0で初期化して、ループで比較しながら解いていく基本的なコードを掲載します。
トレースしやすいように、ループを回しながら現在の最大値を出力しています。
最終的な最大値が最後に出力されています。
#リストの要素数
N=int(input())
#リストを取得
array=list(map(int,input().rstrip().split(' ')))
#仮の最大値ansを宣言して0で初期化
ans=0
#Forループとifで最大値を更新しながら取得する
for num in array:
if num>ans:
ans=num
#トレース文
print('現在の最大値は【'+str(ans)+'】です。')
print(ans)
このトレースコードについて深く知りたい方の多くは基本情報技術者試験を目指されている方か、既にお持ちの方、または講師の方かもしれませんので、宜しければ当ブログの基本情報技術者試験トップページをご覧下さい。アルゴリズムや午後問題の勉強の仕方やオススメ参考書について、かなり詳しく書いています。
では、このコードの話に戻します。
このままでは、paizaの問題の「最大値を出力」に対して余分なコードがあるので、コメントアウトします。
#リストの要素数
N=int(input())
#リストを取得
array=list(map(int,input().rstrip().split(' ')))
#仮の最大値ansを宣言して0で初期化
ans=0
#Forループとifで最大値を更新しながら取得する
for num in array:
if num>ans:
ans=num
#【ここをコメントアウト】print('現在の最大値は【'+str(ans)+'】です。')
print(ans)
ioの出力確認をしてコードを提出。
これで無事正解しました。
次に別解として、max関数を使って最大値を求めるコードを掲載します。
#リストの要素数
N=int(input())
#リストを取得
array=list(map(int,input().rstrip().split(' ')))
#【max関数】を使って出力
print(max(array))
こんな便利な関数があるんだったら、最初からこれ使えって感じですが、自分のトレースの勉強のために冗長でも行いました。
<<GASでの解き方>>
では、同じ問題をGASで解いてみます。
まず、スプレッドシートにこの様に配置しました。
黄色いセルの所に配列の最大値を出力します。
※スプレッドシートに表示する場合は、ループを使って一次元配列ではなく、二次元配列としてからの配列に追加をして作成します※
手順はこのようになります。
1:スプレッドシートからアクティブシートをアクセスする
2:緑色のセル(B1)にある、リストの長さNを取得(この例の場合N=5)
3:配列arrayを宣言して、灰色のセルの範囲の配列を格納する
4:ログで配列を取得できたことを確認
5:最大値に仮の値ansを0で初期化して定義
6:スプレッドシートに二次元配列として格納する配列ans2を定義
7:ループとIFで最大値を比較しながら代入してそのログをトレースしながら出力
8:ansを二次元配列としてans2に追加する
9:ログでans2を出力して確認
10:スプレッドシートの黄色いセルに最大値を出力
手順1: スプレッドシートからアクティブシートをアクセスする
const ss=SpreadsheetApp.getActiveSheet();
これで定数ssにSpreadsheetAppから階層を辿ってアクティブシートにアクセスしています。
手順2:緑色のセル(B1)にあるN乗のNを取得(この例の場合N=10)
const N=ss.getRange(1,2).getValue();
手順3:配列arrayを宣言して、灰色のセルの範囲の配列を格納する
const array = ss.getRange(2, 2, 1, N).getValues();
手順4:ログで配列を取得できたことを確認
console.log(array);
手順5:最大値に仮の値ansを0で初期化して定義
let ans = 0;
手順6:スプレッドシートに二次元配列として格納する配列ans2を定義
const ans2 = [];
手順7:ループとIFで最大値を比較しながら代入してそのログをトレースしながら出力
//ループとIFで最大値を比較しながら代入してそのログをトレースしながら出力
for (let i = 0; i < N; i++) {
if (array[0][i] > ans) {
ans = array[0][i]
}
console.log(`現在の最大値:【${ans}】`);
}
手順8:ansを二次元配列としてans2に追加する
ans2.push([ans]);
手順9:ログでans2を出力して確認
console.log(ans2);
手順10:スプレッドシートの黄色いセルに最大値を出力
ss.getRange(4, 2).setValue(ans2);
スプレッドシートの実行結果です。
GASでの全コードはこちらになります。
function loop17() {
//スプレッドシートからアクティブシートをアクセスする
const ss = SpreadsheetApp.getActiveSheet();
//緑色のセル(B1)にある、リストの長さNを取得(この例の場合N=5)
const N = ss.getRange(1, 2).getValue();
//配列arrayを宣言して、灰色のセルの範囲の配列を格納する
const array = ss.getRange(2, 2, 1, N).getValues();
//ログで配列を取得できたことを確認
console.log(array);
//最大値に仮の値ansを0で初期化して定義
let ans = 0;
//スプレッドシートに二次元配列として格納する配列ans2を定義
const ans2 = [];
//ループとIFで最大値を比較しながら代入してそのログをトレースしながら出力
for (let i = 0; i < N; i++) {
if (array[0][i] > ans) {
ans = array[0][i]
}
console.log(`現在の最大値:【${ans}】`);
}
//ansを二次元配列としてans2に追加する
ans2.push([ans]);
//ログでans2を出力して確認
console.log(ans2);
//スプレッドシートの黄色いセルに最大値を出力
ss.getRange(4, 2).setValue(ans2);
}
宜しかったらコピペしてアレンジして見て下さい。
お疲れ様でした。
ブレイクタイムフォトはこちらになります。
恵比寿ガーデンプレイスの石像
■ 参考文献の紹介■
じっくり丁寧にPythonを学びたい方向け。
まずはpaizaラーニングなどの学習コンテンツで学んで、基礎をマスターしたら、この本でじっくりと初級から中級レベルを目指せます。
初めてGASを学ぶ方向け。
スプレッドシートの基本的な使い方からGASのベースとなるJavaScriptの基礎文法、GASでの初歩的なプログラミングを学べます。
GASに少し慣れて来たら、基礎固めとリファレンスとしてこの本でじっくり学べます。
paizaレベルアップ問題集でPythonとGASを解いて見たに戻る
メインメニューに戻る
Python自作サンプル
GASサンプル
基本情報技術者試験