似非プログラマーの雑多な日記

似非プログラマーの雑多な日記

「継続は力なり」の実証実験してます

【Unity】初心者がUnity Editor上で地図を表示する

GoogleのMaps Static APIを使用してUnity Editor上で地図を表示してみる。

1.環境

PC

MacBook Air M1

Unity

バージョン:2019.4.20f1

2.コード全容

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Networking;

public class GoogleMapTile : MonoBehaviour
{
    // Google Maps API Staticmap URL
    string API_KEY = "自分のAPIキー";    
    string STATIC_MAP_URL = "https://maps.googleapis.com/maps/api/staticmap?";

    // オプションでURLに付加するパラメータ
    public string center = "";
    public string zoom = ""; 
    public int size;
    public string maptype = "";
    public string markers = "";
    public string format = "";
    public string sensor = "";

    // centerに指定するためのもの //
    // 経度
    public float longitude ;
    // 緯度
    public float latitude;

    // Start is called before the first frame update
    void Start()
    {
        StartCoroutine(getStaticMap());
    }

    // Update is called once per frame
    void Update()
    {
        // ただ固定の地図を表示するだけだから特になし
    }

    IEnumerator getStaticMap()
    {
        var req = UnityWebRequestTexture.GetTexture(STATIC_MAP_URL + 
                                                   "center=" + longitude + "," + latitude + 
                                                   "&zoom=" + zoom + 
                                                   "&format=" + format + 
                                                   "&sensor=" + sensor + 
                                                   "&size=" + size + "x" + size + 
                                                   "&maptype=" + maptype +
                                                   "&key=" + API_KEY);
        // リクエスト実行
        yield return req.SendWebRequest();
 
        if (req.error == null)
        {
            GetComponent<Renderer>().material.mainTexture = ((DownloadHandlerTexture)req.downloadHandler).texture;
        }
    }
}

3.実行結果

なぜかデフォルトだと地図が180度回転して表示されるため、InspectorウィンドウでTransform.Rotation.Yを180に設定している。Transform.Position.Yを10に設定しているのは地図を大きく見せるため。
※ 画像ではGoogleMapTileスクリプトが複数あるが1つあればいい。

f:id:captaindream0502:20211113191650p:plain
キャプチャ1

スクリプト内でpublic宣言した変数はInspectorウィンドウで任意のパラメータを設定することができる(赤枠内)。
今回は画像の通りにパラメータを設定して実行。

f:id:captaindream0502:20211113193952p:plain
キャプチャ2

4.コード解説

ポイントの部分だけをかいつまんで解説する。

URLの指定

Google Maps Static APIの利用にはGoogle Cloud Platform(GCP)へのアカウント登録が必要である。登録後、自分のAPIキーを確認し、API_KEYの部分に代入する。

// Google Maps API Staticmap URL
string API_KEY = "自分のAPIキー";    
string STATIC_MAP_URL = "https://maps.googleapis.com/maps/api/staticmap?";

経度・緯度について

経度、緯度はcenterの値として使用する。地図の取得には経度、緯度の情報が必要不可欠である。今回はGoogle Maps API Staticmap公式ページの経度37、緯度-122をそのまま使用した(面倒だから小数点以下は切り捨てた)。
国、あるいは都市によっては、centerにその名称を指定する方法でも地図の取得は可能なようだ。

/* centerに指定するためのもの */
// 経度
public float longitude ;
// 緯度
public float latitude;

非同期処理での実行

StartCoroutine(class in UnityEngine.MonoBehaviour):Unityの公式Scripting API
コルーチンの開始。非同期処理(≒並行処理)のことを言うらしい。IEnumeratorで定義された関数が、非同期処理として動かすことができる。

StartCoroutine(getStaticMap());

リクエストの定義

UnityWebRequestTexture(class in UnityEngine.Networking):Unityの公式Scripting API
ネットワークと通信して画像を取得するくらいのニュアンス。GetTextureはTextureの作成。

var req = UnityWebRequestTexture.GetTexture(STATIC_MAP_URL + 
                                           "center=" + longitude + "," + latitude + 
                                           "&zoom=" + zoom + 
                                           "&format=" + format + 
                                           "&sensor=" + sensor + 
                                           "&size=" + size + "x" + size + 
                                           "&maptype=" + maptype +
                                           "&key=" + API_KEY);

取得した画像をタイルテクスチャに設定

GameObject.GetComponent:Unityの公式Scripting API
このスクリプトがアタッチされているゲームオブジェクトのコンポーネント(Inspectorに表示される各種設定)を取得。今回はPlaneにWEBリクエストで取得した画像をタイルテクスチャとして設定する。

GetComponent<Renderer>().material.mainTexture = ((DownloadHandlerTexture)req.downloadHandler).texture;

 

本来は位置情報を組み合わせてユーザの位置とともに地図を更新する処理を組みたいところだが、なかなか難易度が高く、まずは固定地図の表示ということでやってみた。

以上

【Unity】Mac m1からAndroidの実機にアプリをビルド&デプロイする

※ 2021/10/24時点の情報。

Mac m1上のUnityでAndoridアプリをビルド、実機にデプロイするときに躓いたことの備忘録。

1. 環境

PC

MacBook Air M1

Unity

バージョン:2019.4.20f1

Android

端末:Xperia XZ1 SO-01K

バージョン:9

2. Androidの設定

  1. Android端末とPCをUSB接続する
  2. 開発者オプションを開く
  3. [デバッグ]→USBデバッグをオンにする
  4. [ネットワーク]→デフォルトのUSB設定をファイル転送にする
  5. 「コンピュータにドライバをインストールしますか?」的な文言が出てきたら「はい」。PC側でドライバの設定を行う。無ければスルー
    ※今回はソニーのドライバがPCにインストールされたため設定した

3. Unityの設定

  1. メニューバー[File]→「Build Settings...」
  2. PlatformでAndroidを選択
  3. Run DeviceでUSB接続しているAndroidを選択
  4. Scenes In BuildにAdd Open Scenesから任意のシーンを追加
  5. Build And Run

以上

【Bash】job_spec [&]

Bashの組み込みコマンド「job_spec [&]」を解説

job_specとは?

job_specはコマンドもしくはジョブ番号を指す。job_specというコマンドが存在するわけではない。

jobsコマンドを実行すると現在実行されているジョブを表示することが出来る。

f:id:captaindream0502:20210925131715p:plain

使用方法

適当に無限ループのシェルスクリプトを用意して試す。

f:id:captaindream0502:20210925132908p:plain
3秒毎にHelloと出力するスクリプト

フォアグラウンドでジョブを実行する

(=^·ω·^=) $ %1
f:id:captaindream0502:20210925131820p:plain
実行例

バックグラウンドでジョブを実行する

オプションでアンパサンド(&)を指定するとバックグラウンド実行することが出来る。

(=^·ω·^=) $ %1 &
f:id:captaindream0502:20210925131833p:plain
実行例

なお、ジョブ番号ではなくコマンドを実行した場合はフォアグラウンド実行、「&」を指定するとバックグラウンド実行となる。

sekaiwoshiritai.hatenablog.com

以上

【Bash】組み込みコマンド一覧

Bashの組み込みコマンドを全部試したいもの好き(自分)へ。

環境

組み込みコマンド一覧

# コマンド
1 job_spec [&]
2 (( expression ))
3 . filename [arguments]
4 :
5 [ arg... ]
6 [[ expression ]]
7 alias [-p] [name[=value] ... ]
8 bg [job_spec ...]
9 bind [-lpsvPSVX] [-m keymap] [-f filename] [-q name] [-u name] [-r keyseq] [-x keyseq:shell-command] [keyseq:readline-function または readline-command]
10 break [n]
11 builtin [shell-builtin [arg ...]]
12 caller [expr]
13 case WORD in [PATTERN [| PATTERN]...) COMMANDS ;;]... esac
14 cd [-L|[-P [-e]] [-@]] [dir]
15 command [-pVv] command [arg ...]
16 compgen [-abcdefgjksuv] [-o option] [-A action] [-G globpat] [-W wordlist] [-F function] [-C command] [-X filterpat] [-P prefix] [-S suffix] [word]
17 complete [-abcdefgjksuv] [-pr] [-DE] [-o option] [-A action] [-G globpat] [-W wordlist] [-F function] [-C command] [-X filterpat] [-P prefix] [-S suffix] [name ...]
18 compopt [-o|+o option] [-DE] [name ...]
19 continue [n]
20 coproc [NAME] command [redirections]
21 declare [-aAfFgilnrtux] [-p] [name[=value] ...]
22 dirs [-clpv] [+N] [-N]
23 disown [-h] [-ar] [jobspec ... | pid ...]
24 echo [-neE] [arg ...]
25 enable [-a] [-dnps] [-f filename] [name ...]
26 eval [arg ...]
27 exec [-cl] [-a name] [command [arguments ...]] [redirection ...]
28 exit [n]
29 export [-fn] [name[=value] ...] または export -p
30 false
31 fc [-e ename] [-lnr] [first] [last] または fc -s [pat=rep] [command]
32 fg [job_spec]
33 for NAME [in WORDS ... ] ; do COMMANDS; done
34 for (( exp1; exp2; exp3 )); do COMMANDS; done
35 function name { COMMANDS ; } または name () { COMMANDS ; }
36 getopts optstring name [arg]
37 hash [-lr] [-p pathname] [-dt] [name ...]
38 help [-dms] [pattern ...]
39 history [-c] [-d offset] [n] または history -anrw [filename] または history -ps arg [arg...]
40 if COMMANDS; then COMMANDS; [ elif COMMANDS; then COMMANDS; ]... [ else COMMANDS; ] fi
41 jobs [-lnprs] [jobspec ...] または jobs -x command [args]
42 kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... または kill -l [sigspec]
43 let 引数 [引数 ...]
44 local [option] name[=value] ...
45 logout [n]
46 mapfile [-d delim] [-n count] [-O origin] [-s count] [-t] [-u fd] [-C callback] [-c quantum] [array]
47 popd [-n] [+N | -N]
48 printf [-v var] format [arguments]
49 pushd [-n] [+N | -N | dir]
50 pwd [-LP]
51 read [-ers] [-a array] [-d delim] [-i text] [-n nchars] [-N nchars] [-p prompt] [-t timeout] [-u fd] [name ...]
52 readarray [-n count] [-O origin] [-s count] [-t] [-u fd] [-C callback] [-c quantum] [array]
53 readonly [-aAf] [name[=value] ...] または readonly -p
54 return [n]
55 select NAME [in WORDS ... ;] do COMMANDS; done
56 set [-abefhkmnptuvxBCHP] [-o option-name] [--] [arg ...]
57 shift [n]
58 shopt [-pqsu] [-o] [optname ...]
59 source filename [arguments]
60 suspend [-f]
61 test [expr]
62 time [-p] pipeline
63 times
64 trap [-lp] [[arg] signal_spec ...]
65 true
66 type [-afptP] name [name ...]
67 typeset [-aAfFgilnrtux] [-p] name[=value] ...
68 ulimit [-SHabcdefiklmnpqrstuvxPT] [limit]
69 umask [-p] [-S] [mode]
70 unalias [-a] name [name ...]
71 unset [-f] [-v] [-n] [name ...]
72 until COMMANDS; do COMMANDS; done
73 wait [-n] [id ...]
74 while COMMANDS; do COMMANDS; done
75 { COMMANDS ; }

以上

【競プロ(AtCoder)】ABC044 : B - 美しい文字列 / Beautiful Strings《C++ ver.》

f:id:captaindream0502:20210810000601p:plain
C++_logo

ABC044:B - 美しい文字列 / Beautiful StringsをC++で解いたときの解答。

1. 問題

問題文
wを、英小文字のみからなる文字列とします。wが以下の条件を満たすならば、wを美しい文字列と呼ぶことにします。
  • どの英小文字も、w中に偶数回出現する。
文字列 w が与えられます。w が美しい文字列かどうか判定してください。
制約
  • 1≤∣w∣≤100
  • wは英小文字(a-z)のみからなる文字列である

2. 解答

#include <iostream>

using namespace std;

int main(){

    string w;
    cin >> w;

    sort(w.begin(), w.end());
    
    int count = 0;
    bool flag = true;

    for(int i = 0; i < w.size(); i++){
        if(i > 0 && w[i] != w[i-1]){
            if(count % 2 != 0){
                flag = false;
                break;
            }
            count = 0;
        }
        count++;
    }

    if(flag == true){
        cout << "Yes" << endl;
    }else{
        cout << "No" << endl;
    }
}

3. 所感

ゴリ押しの解法で我ながら実装が綺麗じゃない。iostreamしか使っていない(実際にはstringとかも使われている)分ある意味綺麗な実装ではある。

以上

【AWS】MacBookでEC2にSSH接続する方法

たまにしか使わず忘れてしまうため備忘録として残す。

コトの発端はこれ

時代の流行りに乗るためにAWSでサーバ構築しようと思ったのに入れないじゃん...

ssh: connect to host <IPアドレス> port <Port番号>: Connection refused

SSH接続するための準備

EC2インスタンスは任意の設定で作成済みであることが前提として話を進める。ちなみに勉強用に使うだけならほぼデフォルトの設定で問題ないと思っている。
SSH接続する時のポイントは「キーペア」と「セキュリティグループ」。あとあと確認or変更するから頭に入れておくといい。

f:id:captaindream0502:20210907005559p:plain
EC2ダッシュボード

で、まずはMacのターミナル開いてホームディレクトリに「.ssh」というディレクトリを作る

(=^・ω・^=) ~ % mkdir .ssh

作成したディレクトリにインスタンスと一緒に作成したキーペア、「<キー名>.pem」を入れる。すでに作成済みのキーペアをインスタンスに設定した場合はそれ。

さあ、接続してみよう

準備が済んだらターミナルのメニューバー的なところ「シェル→[新規リモート接続]」をクリックする

f:id:captaindream0502:20210907010452p:plain
新規リモート接続

下記の画面が表示されたら「セキュアシェル(ssh)」を選択。上から2つめの長い赤枠に接続時のコマンドを入力する

f:id:captaindream0502:20210907074749p:plain
セキュアシェル

接続時のコマンドは下記

ssh -i ~/.ssh/<pemファイル> <ユーザ名>@<EC2のPublic DNS (IPv4)もしくはIPv4 Public IP>

例えば、.sshディレクトリに置いたpemファイルの名称が「secret_key.pem」、ユーザ名が「madao」、IPv4 Public IPが「100.1.2.30」だったら

ssh -i ~/.ssh/secret_key.pem madao@100.1.2.30

IPv4 Public IPで入れなかったらPublic DNS (IPv4)を指定するといい。

チクショー、接続できない

これまで説明した通りにやっても接続できない時は、インスタンスに設定されている「セキュリティグループ」のポートが開放されていることを確認する。

  1. セキュリティグループのインバウンドルールを編集
  2. タイプ「SSH」をルールに追加
  3. ソースに「マイIP」を選択し、編集内容を保存。

f:id:captaindream0502:20210907230157p:plain
セキュリティグループ

再度、ターミナルからSSH接続を行うと接続できるはずだ。
ただし、この方法だと自分の居場所が変わる or Wi-Fi接続が変更される度にセキュリティグループの設定を更新する必要があるため、頻繁に自分のPCからSSH接続する場合は別途設定が必要。

以上

線形探索を高速化する【番兵】

アルゴリズムとデータ構造に関して学んだことの備忘録。
今回は「番兵」を用いて線形探索を高速化する方法。

1. 線形探索とは

線形探索は、あるデータが、あるデータ群の中に含まれているかを先頭のデータから順に調べる方法である。
プログラミングでは一般的に配列に対して用いられ、配列の先頭の要素から順に、目的の値と等しいかどうかを調べる。

線形探索の例

処理速度を測りたいためある程度の長さの配列に対して下記の条件で試す。

  • 配列の長さ(要素数)は500
  • 配列は自然数1-100の数字を持つ
  • 目的の数字は99
  • 目的の数字はできるだけ要素番号の大きい方に置く

#include <iostream>
using namespace std;
int main(){
    int array[500] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 
                      40, 39, 38, 37, 36, 35, 34, 33, 32, 31, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 
                      61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 80, 79, 78, 77, 76, 75, 74, 73, 72, 71, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 
                      100, 100, 98, 97, 96, 95, 94, 93, 92, 91,1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 
                      21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 40, 39, 38, 37, 36, 35, 34, 33, 32, 31, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 
                      60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 80, 79, 78, 77, 76, 75, 74, 73, 72, 71, 
                      81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 100, 100, 98, 97, 96, 95, 94, 93, 92, 91,1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 
                      20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 40, 39, 38, 37, 36, 35, 34, 33, 32, 31, 
                      41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 
                      80, 79, 78, 77, 76, 75, 74, 73, 72, 71, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 100, 100, 98, 97, 96, 95, 94, 93, 92, 91,
                      1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 
                      40, 39, 38, 37, 36, 35, 34, 33, 32, 31, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 
                      61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 80, 79, 78, 77, 76, 75, 74, 73, 72, 71, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 
                      100, 100, 98, 97, 96, 95, 94, 93, 92, 91,1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 
                      21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 40, 39, 38, 37, 36, 35, 34, 33, 32, 31, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 
                      60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 80, 79, 78, 77, 76, 75, 74, 73, 72, 71, 
                      81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 100, 99, 98, 97, 96, 95, 94, 93, 92, 91};

    int target = 99; // 目的の数字
    string result = "NO";

    for(int i = 0; i < 500; i++){
        if(array[i] == target){
            result = "YES";
            break;
        }
    }

    cout << result << endl;
}

上記は単純な線形探索の例を示した。次に説明する「番兵」を用いることで処理速度を上げることができる。

2. 番兵とは

番兵は、ループの制御を簡略化する目的などで使われる方法である。番兵を用いると通常の線形探索の定数倍の速度向上が期待できるらしい。
番兵を線形探索で実装する場合は、探索対象の配列の末尾に目的の要素を追加する。上の例題の場合は配列の末尾に99を追加することになる。

なぜ高速化が期待できるのか

ポイントは「メインのループ処理における比較演算の数」である。
例のように通常の線形探索を行なった場合は、forループの終了条件と目的の値との比較の2つの演算が必要であるが、番兵を用いて実装した場合は、while文の終了条件1つで済む(番兵によってwhile分が必ず終了することが担保されているため)

1.の例を番兵で試してみる。

#include <iostream>
using namespace std;
int main(){
    // 番兵を置くことを前提としているため明示的に500+1としている、固定長配列はあとから追加できないから。
    int array[500+1] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 
                        40, 39, 38, 37, 36, 35, 34, 33, 32, 31, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 
                        61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 80, 79, 78, 77, 76, 75, 74, 73, 72, 71, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 
                        100, 100, 98, 97, 96, 95, 94, 93, 92, 91,1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 
                        21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 40, 39, 38, 37, 36, 35, 34, 33, 32, 31, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 
                        60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 80, 79, 78, 77, 76, 75, 74, 73, 72, 71, 
                        81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 100, 100, 98, 97, 96, 95, 94, 93, 92, 91,1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 
                        20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 40, 39, 38, 37, 36, 35, 34, 33, 32, 31, 
                        41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 
                        80, 79, 78, 77, 76, 75, 74, 73, 72, 71, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 100, 100, 98, 97, 96, 95, 94, 93, 92, 91,
                        1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 
                        40, 39, 38, 37, 36, 35, 34, 33, 32, 31, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 
                        61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 80, 79, 78, 77, 76, 75, 74, 73, 72, 71, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 
                        100, 100, 98, 97, 96, 95, 94, 93, 92, 91,1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 
                        21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 40, 39, 38, 37, 36, 35, 34, 33, 32, 31, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 
                        60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 80, 79, 78, 77, 76, 75, 74, 73, 72, 71, 
                        81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 100, 99, 98, 97, 96, 95, 94, 93, 92, 91};

    int target = 99; // 目的の数字

    int i = 0;
    array[500] = target; // 番兵 // 配列番号は0から始まるから最後尾は100+1ではないことに注意
    while(array[i] != 99){
        i++;
    }

    if(i != 500){
        cout << "YES" << endl;
    }else{
        cout << "NO" << endl;
    }
}

番兵を使って実装するとこんな感じ。実際は可変長配列を使うのが普通だろうが、簡単にするために固定長配列にした。

3. まとめ

timeコマンドを使って速さを計測したけど長さ500程度の配列じゃ差はなかったwww
もしかしたら実装の方法に問題があるのかもしれないので、使いどころ含め学習を続ける

以上