けんちょんの競プロ精進記録

競プロの精進記録や小ネタを書いていきます

AtCoder ABC 321 A - 321-like Checker (灰色, 100 点)

入力を文字列として受け取ってしまうのが楽だと思う!

問題概要

各桁の値が単調減少 (等しいはダメ) になっている数を 321-like 数と呼ぶことにする。

たとえば、971 や 5 は 321-like 数であるが、978 や 988 は 321-like 数ではない。

与えられた正の整数  N が 321-like 数であるかどうかを判定せよ。

制約

  •  1 \le N \le 99999

メモ

int 型で受け取ってもよいが、各桁の値を取り出すのが面倒になってしまう (可能ではある)。

そこで、string 型の変数 N で受け取ろう。そうすれば「左から  i 文字目の数値」を N[i] で取得できる。なお、取得した値は正確には文字リテラルであることに注意。たとえば、N = "972" のとき、N[0] = '9' であって、N[0] = 9 ではない。

それでも、単調減少かどうかの判定は、文字リテラルのまま隣り合う要素同士の大小比較を行えばよい。

コード

#include <bits/stdc++.h>
using namespace std;

int main() {
    string N;
    cin >> N;
    
    // すべての i に対して、N[i] > N[i+1] であるべき!
    // よって、N[i] <= N[i+1] となる箇所が 1 個でもあったら false にする
    bool ok = true;
    for (int i = 0; i + 1 < N.size(); ++i) {
        if (N[i] <= N[i+1]) {
            ok = false;
        }
    }
    
    if (ok) cout << "Yes" << endl;
    else cout << "No" << endl;
}