Official

A - 123233 Editorial by physics0523


初心者の方へ

解法1: 各桁に何が何文字含まれるか数える

整数 \(N\) の各桁を取り出す方法は色々ありますが、次のアルゴリズムが最も基本的です。

  • \(N>0\) である限り、以下を繰り返す。
    • \(N\)\(10\) で割った余りを記録する。その後、 \(N\)\(10\) で割って小数点以下を切り捨てる。
  • このとき、記録された数が \(N\) の各桁である。

例えば \(380\) なら以下のように動作します。

  • \(380\)\(10\) で割った余りは \(0\) であり、 \(380\)\(10\) で割って小数点以下を切り捨てると \(38\) となる。
  • \(38\)\(10\) で割った余りは \(8\) であり、 \(38\)\(10\) で割って小数点以下を切り捨てると \(3\) となる。
  • \(3\)\(10\) で割った余りは \(3\) であり、 \(3\)\(10\) で割って小数点以下を切り捨てると \(0\) となる。

これで、 \(380\) の各桁 \(3,8,0\) を得ることができました。 一連の流れは、 while 文を用いると簡潔に書くことができます。

こうしてどの数字が何桁含まれるかを数えた後、問題文中の条件を満たすか判定すればよいです。 これを実現するには、バケットソートの要領で実装すると容易です。

実装例 (C++):

#include<bits/stdc++.h>

using namespace std;

int main(){
  int n;
  cin >> n;
  vector<int> mem(10,0);
  while(n>0){
    mem[n%10]++;
    n/=10;
  }
  if(mem[1]==1 && mem[2]==2 && mem[3]==3){
    cout << "Yes\n";
  }
  else{
    cout << "No\n";
  }
  return 0;
}

解法2: 各桁をソートして 122333 と一致するか判定

出力が Yes になることと、 \(N\) の各桁を並べ替えた時に \(122333\) になることとは同値です。
そのため、「 \(N\) を文字列として受け取る」「\(N\) を受け取った後文字列に変換する」といった行為をした後、「文字列中の文字を昇順(小さい方から大きい方に)ソートし、 \(122333\) と一致するか判定」ということをしてもこの問題に正解できます。

実装例1 (C++):

#include<bits/stdc++.h>

using namespace std;

int main(){
  int n;
  cin >> n;
  string s=to_string(n);
  sort(s.begin(),s.end());
  if(s=="122333"){cout << "Yes\n";}
  else{cout << "No\n";}
  return 0;
}

実装例2 (C++):

#include<bits/stdc++.h>

using namespace std;

int main(){
  string s;
  cin >> s;
  sort(s.begin(),s.end());
  if(s=="122333"){cout << "Yes\n";}
  else{cout << "No\n";}
  return 0;
}

posted:
last update: