こんにちは。最近Pythonとc++の連携ができるようになってからc++の技術が上がってきたと感じているので、今日は久し振りにAtcoderに手を出してみました。Python軸でAtcoderに参加していた時は、制限時間の壁があまりにもキツすぎて解けているのに間に合わないということがよくありました。その点C++であれば問題ない!はず。結果としては60分でABCの3問正解という感じでした。(頭痛のせいで60分以上の作業は正直きつい)
それでは、RockinWool自己流の解答をご笑覧あれ。
A問題(Spread) 難易度:超かんたん
入力文字に対して、スペースを開けて返答しろという非常に簡単な問題。A問題の中でも過去一簡単なのでは?と感じました。c++のstringの使い方さえ間違わなければ大丈夫。それと最後の文字以降にスペースを入れてはいけないとのことだったのでif文で分岐させました。(個人的には、この難易度でも20行近く書く必要のあるc++って不便だなと感じるなど)
#include <iostream>
#include <string>
using namespace std;
int main(){
string Input;
cin >> Input;
for(int i=0;i<Input.size();i++){
cout << Input[i];
if(i==Input.size()-1){
continue;
}else{
cout<<" ";
}
}
cout << endl;
return 0;
}
B問題(Next) 難易度: 普通
B問題はごく普通の難易度。もしかしたら過去と比べて簡単な方かもしれない。最大値の次に大きな数を答えるということで、最大値が複数ある場合にも対応できるかどうかが問われている。今回はvectorとsortを使って、入力を降順に並び替えたのちに最大値よりも小さくなった瞬間の数を返答するようにした。
#include <iostream>
#include <vector>
#include <algorithm>
#include <unordered_map>
using namespace std;
int main(){
int N;
cin >> N;
vector<int> inputvec(N,0);
for(int i=0;i<N;i++){
cin >> inputvec[i];
}
sort(inputvec.rbegin(),inputvec.rend());
int max = inputvec[0];
for(int i=1;i<N;i++){
if(inputvec[i]<max){
cout << inputvec[i] <<endl;
return 0;
}else{
continue;
}
}
return 1;
}
C問題(Count xxx) 難易度: 比較的簡単
C問題は過去と比べかなり簡単な方かも。文字の組み合わせを答えろと言われているが、要は連続した同一文字からなる文字列の長さを足し合わせれば良い。例えばaaabbccだと3+2+2=7という感じ。問題はaaabbaaだと3+2=5となる点(aは3と2のパターンがあるが、大きい方を採用する)。この考え方を実現するにはa:3,b:2のようなpythonで言うdictionary型のデータが必要であることに気づく。ということはunordered_map<char,int>といったデータを用意して代入していけば良い。
#include <vector>
#include <string>
#include <iostream>
#include <unordered_map>
using namespace std;
int main(){
string inputstr;
int N;
cin >> N;
cin >> inputstr;
int count =0;
int parts_length =1;
unordered_map<char,int> parts;
if(inputstr.size()==1){
cout << "1" <<endl;
return 0;
}
for(int i=0;i<inputstr.size()-1;i++){
if(inputstr[i]==inputstr[i+1]){
parts_length +=1;
if(i==inputstr.size()-2){
if(parts[inputstr[i]]<parts_length){
parts[inputstr[i]]=parts_length;
}
}
}else{
if(parts[inputstr[i]]<parts_length){
parts[inputstr[i]]=parts_length;
}
if(i==inputstr.size()-2){
if(parts[inputstr[i+1]]<1){
parts[inputstr[i+1]]=1;
}
}
parts_length=1;
}
}
for(auto entry:parts){
// cout << entry.first <<entry.second <<endl;
count += entry.second;
}
cout << count <<endl;
return 0;
}
この解答で少し不満なのは、ループ部分でi番目の文字とi+1番目の文字を比べている仕様上、最終文字とその直前が違う場合にif文を組まなければならない点。例えば最初のif文では入力が1文字である場合の例外を設けているし、以降にもif(i==inputstr.size()-2)の時に分岐するようにひと手間かけている。もう少し美しく書けたかもしれないが、制限時間中には思いつかなかった。しかし、過去のC問題に比べると例外処理の少なさから、非常に簡単な問題だったと感じる。ただ、個人的にはABC正答できたのは嬉しい。
結び
今回の問題は結構簡単に感じましたが、もしかしたら自分の能力が上がってきているのかもと自信が付きました。これからもpythonとc++をどんどん連携させて、c++をバリバリ書けるようになっていきたいですし、それを記事にしていこうと思いますので温かい目で見守ってください!
それでは、よいプログラミング生活を!