paiza レベルアップ問題集 「STEP: 2 数列の最小値」をPythonとGASで解いてみた

この記事を読むと、PythonでのIF文・Forループの基本的な書き方と、min関数をprint文の中で使って最小値を求める方法を学べます。

このコーナーでは、学習コンテンツ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 (a_1, a_2, …, a_N) が与えられます。
この数列の最小値を出力してください。

この記事では、入力例3でNにリスト長さが「6」、リストに「8 2 3 8 3 3」が与えられたという条件で解いて行きます。

入力例3
6
8 2 3 8 3 3

出力例3
2

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

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

<<Pythonでの解き方>>

下準備として、paiza.ioにこの様に入力します。

手順として、
1:標準入力でNを取得
2:標準入力でリストを取得
3:仮の最小値ansを999で初期化して宣言
4:ループとIFで最大値を比較しながら代入
5:ループを回しながら【現在の最小値】のトレースをして出力
6:最小値ansを出力

まずは、仮の最小値ansを999にして、ループで比較しながら解いていく基本的なコードを掲載します。
トレースしやすいように、ループを回しながら現在の最小値を出力しています。
最終的な最小値が最後に出力されています。

最小値を入れる変数ansを仮に999で初期化しているのは、この問題には下記の条件があるからです。

条件
すべてのテストケースにおいて、以下の条件をみたします。
・ 1 ≦ N ≦ 100
・ 0 ≦ a_i ≦ 100 (1 ≦ i ≦ N)
つまり、999ではなくても101以上の数だったらOKです。

では、コードを見て行きます。

#標準入力でNを取得
N=int(input())

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

#仮の最小値ansを999で初期化して宣言
ans=999

#ループを回しながら【現在の最小値】のトレースをして出力
for num in array:
    if num<ans:
        ans=num
    print('現在の最小値は【'+str(ans)+'】です。')

#最小値ansを出力
print(ans)

実行するとこのように値が変わって出力されていることが確認できます。

このトレースコードについて深く知りたい方の多くは基本情報技術者試験を目指されている方か、既にお持ちの方、または講師の方かもしれませんので、宜しければ当ブログの基本情報技術者試験トップページをご覧下さい。アルゴリズムや午後問題の勉強の仕方やオススメ参考書について、かなり詳しく書いています。

では、このコードの話に戻します。
このままでは、paizaの問題の「最小値を出力」に対して余分なコードがあるので、コメントアウトします。


#標準入力でNを取得
N=int(input())

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

#仮の最小値ansを999で初期化して宣言
ans=999

#ループを回しながら【現在の最小値】のトレースをして出力
for num in array:
    if num<ans:
        ans=num
    #【ここをコメントアウト】print('現在の最小値は【'+str(ans)+'】です。')

#最小値ansを出力
print(ans)

ioの出力確認をしてコードを提出。

これで無事正解しました。

次に別解として、min関数を使って最大値を求めるコードを掲載します。

#標準入力でNを取得
N=int(input())

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

#【min関数を使って】最小値ansを出力
print(min(array))

こんな便利な関数があるんだったら、最初からこれ使えって感じですが、自分のトレースの勉強のために冗長でも行いました。

<<GASでの解き方>>

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

黄色いセルの所に配列の最小値を出力します。

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

手順はこのようになります。
1:スプレッドシートからアクティブシートをアクセスする
2:緑色のセル(B1)にある、リストの長さNを取得(この例の場合N=6)
3:配列arrayを宣言して、灰色のセルの範囲の配列を格納する
4:ログで配列を取得できたことを確認
5:最小値に仮の値ansを999で初期化して定義
6:スプレッドシートに二次元配列として格納する配列ans2を定義
7:ループとIFで最小値を比較しながら代入してそのログをトレースしながら出力
8:ansを二次元配列としてans2に追加する
9:ログでans2を出力して確認
10:スプレッドシートの黄色いセルに最小値を出力

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

const ss=SpreadsheetApp.getActiveSheet();

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

手順2:緑色のセル(B1)にある、リストの長さNを取得(この例の場合N=6)

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

手順3:配列arrayを宣言して、灰色のセルの範囲の配列を格納する

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

手順4:ログで配列を取得できたことを確認

console.log(array);

手順5:最小値に仮の値ansを999で初期化して定義

let ans = 999;

手順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 loop18() {

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

  //緑色のセル(B1)にある、リストの長さNを取得(この例の場合N=6)
  const N = ss.getRange(1, 2).getValue();

  //配列arrayを宣言して、灰色のセルの範囲の配列を格納する
  let array = ss.getRange(2, 2, 1, N).getValues();

  //ログで配列を取得できたことを確認
  console.log(array);

  //最小値に仮の値ansを999で初期化して定義
  let ans = 999;

  //スプレッドシートに二次元配列として格納する配列ans2を定義
  let 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サンプル
基本情報技術者試験

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

投稿者: nekosiestr

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