Official
A - 123233 Editorial
by
A - 123233 Editorial
by
physics0523
初心者の方へ
- プログラミングの学習を始めたばかりで何から手をつけるべきかわからない方は、まずは practice contest の問題A「Welcome to AtCoder」をお試しください。言語ごとに解答例が掲載されています。
- また、プログラミングコンテストの問題に慣れていない方は、 AtCoder Beginners Selection の問題をいくつか試すことをおすすめします。
- C++入門 AtCoder Programming Guide for beginners (APG4b) は、競技プログラミングのための C++ 入門用コンテンツです。
- Python入門 AtCoder Programming Guide for beginners (APG4bPython) は、競技プログラミングのための Python 入門用コンテンツです。
解法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:
