見出し画像

ABC202 B 解答

B - 180°(16)

問題

問題文

0、1、6、8、9 からなる文字列 S が与えられます。
S を 180 度回転したものを出力してください。すなわち、S に次の操作を施してできる文字列を出力してください。
S を反転する。0 を 0 に、1 を 1 に、6 を 9 に、8 を 8 に、9 を 6 に変換する。

制約

1 ≤ |S| ≤ 10^5
S は 0、1、6、8、9 からなる。

考察

ありがたいことに問題文で具体的な操作方法を示してくれています。それに従いましょう。

やることは2つです。

1)文字列を逆順にする

2)9→6、6→9に変更する

です。1)はreverseを読んであげましょう。文字列を Sとすると

reverse(S.begin(),S.end());

で逆順になります。

2)は1文字ずつ見ていけば良さそうです。6だったら9にして、9だったら6にします。ただここで一つ注意です。文字列の各要素のアクセスは

S[i]

で可能ですが、例えば

S[i] = ‘9’

としても文字列を書き換えることはできません。ですので、別の文字列に詰め込むか、そのまま出力しちゃいましょう。

これを全部の文字で行えば正解となります。

実装

 #include <bits/stdc++.h> #define  rep(i,n) for(int i=0;i<n;++i) #define  reps(i,s,n) for(int i=s;i<n;++i)
using namespace std;
using ll = long long;
using P = pair<ll, ll>;

int main()
{
   string s;
   cin >> s;
   reverse(s.begin(), s.end());

   for (auto c : s)
   {
       if (c == '6') cout << '9';
       else if (c == '9')cout << '6';
       else cout << c;
   }
   cout << endl;
   return 0;
}

あとがき

stringが書き換えできない理由について少し触れます。

これPAST本にも書いてあるのですが、書き換えできない理由としては

stringは「イミュータブル」であるから

というのが回答になります。なかなか聞きなれない言葉だとは思いますが、実はこれのおかげでとても扱いやすくなっています。

もう少し言いますと、stringは参照型です。なのですが、この「イミュータブル」のおかげで値型のような振る舞いを見せてくれます。賢い人が便利になるように作ってくれているんですね。

詳しく知りたい方は「ミュータブル:mutable」「イミュータブル:immutable」「値型と参照型」あたりのキーワードで調べてみてください。少々難しい話ですが、言語仕様に触れるのもなかなか面白いですよ。

この記事が気に入ったらサポートをしてみませんか?