ABC050初心者備忘録 Rubyの勉強がC++の役に立った話

  1. 初めてブログを書いたことの振り返り
  2. 問題A
  3. 問題B
  4. 問題C
  5. まとめ

三行雑まとめ

  1. ブログを振り返る!
  2. 問題を振り返ってみる!
  3. プログラミングの効果

……といったものになります

ぶっちゃけ前半は前回のブログを書いたことに関する感想文なので、問題などをとっとと見たい方は問題Aの項目まで飛ばしちゃって大丈夫です

  初めてブログを書いたことの振り返り

実際にやってみると以外と躓く。そして楽しい!これが結論であり全てです。開発経験は?と聞かれる理由が分かりました。これに関してはうだうだ言うよりも。
初心者の方は何か形に残るものを作ってみよう!
これに尽きます。色々と読んだり動画見ながらコード写経するより大きい経験値が得られると思いました、もちろん最低限の基礎は必要ですが。
そして当ブログに関しては、しばらくはrails on tutorialの進捗と競プロ、後は気になったこと色々の雑記にしようと考えています。ふわふわしてますがよろしくお願いします。

  問題A

A - Haiku

ヘッダファイル部分は省略します。なんかヘッダファイルの読み込み部分がが消えるので……


using namespace std;
 
int main() {
  string s;
  cin >> s;
  for (int i = 0; i < s.size(); i++) {
    if (s[i] == ',') s[i] = ' ';
  }
  cout << s << endl;
}
 

要はsの中身を全部見て'.'の部分を' 'で置換するやつです。語ることもないので次!

  問題B

B - Sum of Three Integers


 
int main() {
  int k, s;
  cin >> k >> s;
  int answer = 0;
  for (int i = 0; i <= k; i++) {
    for (int j = 0; j <= k; j++) {
      if (0 <= s - i - j && s - i - j <= k) answer++;
    }
  }

  cout << answer << endl;
}

    

過去問精進10選の第8問と同じで、2500^3=(2.5*10^3)^3>10^9であることは簡単に予想できるので計算量を減らす工夫として二重ループの後に比較しましょうというものです。

詳しくは、Atcoderチュートリアルにも載っている過去問精進10選を参考にしましょう。もしこれが分からなかった方は見直すのがおすすめです

  問題C

C - Back and Forth


 
using namespace std;
 
void moveR(int x1, int x2) {
  for (int i = 0; i < x2 - x1; i++) {
    cout << 'R';
  }
}
 
void moveU(int y1, int y2) {
  for (int i = 0; i < y2 - y1; i++) {
    cout << 'U';
  }
}
 
void moveL(int x1, int x2) {
  for (int i = 0; i < x2 - x1; i++) {
    cout << 'L';
  }
}
 
void moveD(int y1, int y2) {
  for (int i = 0; i < y2 - y1; i++) {
    cout << 'D';
  }
}
 
int main() {
  int sx, sy, tx, ty;
  cin >> sx >> sy >> tx >> ty;
  moveR(sx, tx);
  moveU(sy, ty);
  moveL(sx, tx);
  moveD(sy, ty);
  cout << 'D';
  moveR(sx, tx + 1);
  moveU(sy, ty + 1);
  cout << 'L' << 'U';
  moveL(sx, tx + 1);
  moveD(sy, ty + 1);
  cout << 'R' << endl;
  return 0;
}
    

はい、お待ちかねのクソコードの時間です

 

といってもこちらは簡単でstring(文字数,'文字')で初期化出来ることを知らなかったというのが反省点ですね。知識は本当大事、やるたびにいつも思います。

いつもならこのfor文を一つ一つ手書きで描いてるので、相対的に見て成長している…?と自分を甘やかしてみます。

経路についてですが、要は長方形を作るような経路を通った後にその1マス外側を通るというものです。説明に関してはAtcoderの解説を見てもらえれば分かるのですが、いくつかやってみて迷路問題は競プロにおける一種の典型問題であると思ったのでこの周り4マスは必ず通るという考え方は今後度々使われていくと思っています。ちなみに某社のインターンのテストで正にその考えを使う問題に気が付いたけど、リアルの時間がなくてwebテスト途中で実装部分だけ書いたのが最近の後悔です。当たり前ですがwebテストは余裕のある時に受けましょう。

 

  まとめ

まず始めに、問題Cは今まで苦戦だらけだったのでめちゃくちゃあっさり解けたことに驚いています。もちろん難易度の違いもありますが、10分足らずで解けたのは結構珍しいです。

その理由として考えられるのが、Rubyを勉強したことです。

私はdfsや再帰など、ある程度テンプレ化しているもの以外で関数を作るのが極端に苦手だったのですが、ProgateのRubyの講座はオブジェクト指向だったのでどうしても返り値やら受け渡しの概念を理解しないといけません。

ですが、CやC++に比べて非常に分かり易かったために既存の知識と組み合わせるとすらすら解けました。それだけではなく、Rubyの勉強を行うことによって逆にCやC++の理解も深まりました

結論としては、他の勉強を行うことで、自分が詰まっている概念について理解が深まるということは結構あるのではないかという推測ができそうです。少なくとも理工系の授業はそういった側面が多いので……勘ですが。
私自身、まだまだまだまだ初心者ですので、あくまで参考程度にしてくださって大丈夫です。

 

後、どうでもいいのですが、ブログを書き慣れていないせいでいわゆる『いかがでしたかブログ』みたいな文章になりました……今回の文章、いかがでしたか?