C++競プロ学習日記(仮)

( 学習記録であり解説Blogではないです )

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の中で処理を考えるの本当に険しい...。
勉強になりました。