No.239 にゃんぱすー|yukicoder
No.239 にゃんぱすー - yukicoder を解きました。
#include <bits/stdc++.h> using namespace std; int main (){ int n; cin >> n; string s[100][100]; for(int i=0; i<n; i++){ for(int j=0; j<n; j++){ cin >> s[ i ][ j ]; } } set<int> st; for(int i=0; i<n; i++){ int count{0}; for(int j=0; j<n; j++){ if( s[ j ][ i ] == "nyanpass" ){ count++; } } if(count == n - 1){ st.insert( i ); } } cout << ( st.size() == 1 ? *begin(st) + 1 : -1 ) << endl; return 0; }
loopの列と行を逆にするという発想が無くてcount しづらく苦戦しました...。
そこで std::set に入れちゃえば良いのでは(?)みたいな発想に至ったのですが...
結局 loopの列と行を逆にした方が全てスムーズでした。
それから↑ここに貼ったコードはかなり書き直したものなのですが、
不要なbool判定、if判定などなど...を削りました。
個人的には std::set を使えたのが良かったです!!
昨年ABC-B埋めをしている頃は全然使えなかったのを思い出しました。
*begin(st)
↑これでsetの先頭要素を取得出来るのを学習。(メモ)
あと、st.size()とst.count()とか...。
特にst.count()使えたら便利そう!な気がしました。
(参考:C++ 順序付集合 std::set 入門 )
この問題、この後、std::set を使わないで解こうって某bさんに言われたので
std::setを使わない方法で書き直したりもしました。
提出:#93117 No.239 にゃんぱすー - yukicoder
2重loopの中で処理を考えるの本当に険しい...。
勉強になりました。