๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Algorithm

[BOJ] 1058๋ฒˆ. ์นœ๊ตฌ (C++ 17)

by ์œ ๋ฏธ๋ฏธYoomimi 2023. 8. 2.

 

์ด ๋ฌธ์ œ๋ฅผ ์‰ฝ๊ฒŒ ํ’€์–ด ๋งํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.


i๋ฒˆ์งธ ์‚ฌ๋žŒ์˜ 2-์นœ๊ตฌ๋Š”,
์ผ๋‹จ ๊ทธ์˜ ์ง๊ณ„ ์นœ๊ตฌ๋Š” ์ผ๋‹จ ๋‚ด 2-์นœ๊ตฌ๊ณ ,
์ง๊ณ„ ์นœ๊ตฌ๊ฐ€ ์•„๋‹Œ ์นœ๊ตฌ์˜ ์นœ๊ตฌ๋“ค๊ณผ ๊ทธ์˜ ์นœ๊ตฌ๋“ค์„ ๋Œ€์กฐํ•ด ๊ฒน์ง€์ธ์ด ํ•œ๋ช…์ด๋ผ๋„ ์žˆ์œผ๋ฉด ๊ทธ ์นœ๊ตฌ๋„ ๊ทธ์˜ 2-์นœ๊ตฌ๋‹ค.

 

๊ฒน์ง€์ธ์ด ํ•œ๋ช…์ด๋ผ๋„ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ AND ์—ฐ์‚ฐ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ณ  ์‹ถ์–ด์„œ,

์ž…๋ ฅ๋ฐ›์„ ๋•Œ Y๋ฅผ 1๋กœ N์„ 0์œผ๋กœ ์ž…๋ ฅ๋ฐ›์•˜๋‹ค.

 

 

 

๋”ฐ๋ผ์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ’€๊ณ ์ž ํ–ˆ๋‹ค.


i๋ฒˆ์งธ ํ–‰ ์‚ฌ๋žŒ์˜ 2-์นœ๊ตฌ์ˆ˜๋Š”
์ž๊ธฐ ํ–‰์˜ 1์˜ ์ˆ˜๋ฅผ ๋‹ค ๋”ํ•ด 2-์นœ๊ตฌ์ˆ˜์— ํ•ฉํ•ด ๋‘๊ณ (์ง๊ณ„ ์นœ๊ตฌ ์ˆ˜),
์ž๊ธฐํ–‰์—์„œ 0(N)์ธ ๋ฒˆ์งธ๋ฅผ j๋ผ๊ณ  ํ•˜๋ฉด

jํ–‰์˜ ์นœ๊ตฌ์™€ ์ž๊ธฐํ–‰์„ AND ์—ฐ์‚ฐํ•˜์—ฌ ๊ทธ ์ดํ•ฉ์ด 1์ด์ƒ์ด๋ฉด (๊ฒน์ง€์ธ์ด ์žˆ๋Š” ๊ฑฐ๋‹ˆ๊นŒ) ์ž๊ธฐ 2-์นœ๊ตฌ์ˆ˜์— 1์„ ๋”ํ•œ๋‹ค.

 

 

์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ์ž‘์„ฑํ–ˆ๋‹ค.

 

#include <iostream>
#include <string>
#include <vector>
#include <numeric>
#include <algorithm>

using namespace std;

int main() {
    int N;
    cin >> N;
    cin.ignore();

    vector<string> arr;
    string arr2;

    for (int i = 0; i < N; i++) {
        cin >> arr2;
        for (int j = 0; j < N; j++) {
            if (arr2[j] == 'Y') {
                arr2[j] = 1;
            } else if (arr2[j] == 'N') {
                arr2[j] = 0;
            }
        }
        arr.push_back(arr2);
    }

    /*i๋ฒˆ์งธ ์‚ฌ๋žŒ์˜ ์นœ๊ตฌ์ˆ˜๋ฅผ ๊ตฌํ•ด์„œ ์นœ๊ตฌ์ˆ˜ ๋ฒกํ„ฐ์— ๋„ฃ๊ธฐ*/

    vector<int> friends;

    for (int i=0; i<N ; i++){
        int sum = 0;
        sum = accumulate(arr[i].begin(), arr[i].end(), 0); // ์ž์‹ ์˜ ์ง๊ณ„ ์นœ๊ตฌ ์ˆ˜์˜ ํ•ฉ

        /*์ง๊ณ„ ์นœ๊ตฌ๋Š” ์•„๋‹ˆ์ง€๋งŒ ๊ฒน์ง€์ธ์ด ์žˆ๋Š” ๊ฒฝ์šฐ ์ฒดํฌ*/
        for (int j=0; j<N; j++){
            if ((arr[i][j]==0)&(i!=j)){
                vector<int> result(N);

                /*AND ์—ฐ์‚ฐํ•œ ๋ฐฐ์—ด์ด ๊ฒน์ง€์ธ์˜ ์ˆ˜๋‹ˆ๊นŒ ๊ฒน์ง€์ธ์ด 1๋ช…์ด๋ผ๋„ ์žˆ์œผ๋ฉด 2-์นœ๊ตฌ๋กœ ์„ธ์–ด์•ผ ํ•จ*/
                transform(arr[i].begin(), arr[i].end(), arr[j].begin(), result.begin(), [](int a, int b) { return a & b; });
                if(accumulate(result.begin(), result.end(), 0) != 0) { sum += 1; }
            }
        }
        friends.push_back(sum);
    }

    sort(friends.rbegin(),friends.rend());
    cout << friends[0] << endl ;
}

์ฝ”๋“œ์—์„œ

 
transform(arr[i].begin(), arr[i].end(), arr[j].begin(), result.begin(), [](int a, int b) { return a & b; });
 

์ด ๋ถ€๋ถ„์„ ์‚ดํŽด๋ณด๋ฉด

 

arr[i]์˜ begin๋ถ€ํ„ฐ end๊นŒ์ง€๋ฅผ, arr[j]์˜ begin๋ถ€ํ„ฐ์™€ AND์—ฐ์‚ฐํ•ด์„œ(์–˜๋Š” ๋์„ ํ‘œ์‹œํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.),

result์˜ begin๋ถ€ํ„ฐ ์ €์žฅํ•œ๋‹ค๋Š” ๋œป์ด๋‹ค.

์ด๋•Œ AND์—ฐ์‚ฐ์— ํ•ด๋‹นํ•˜๋Š” ๋‚ด์šฉ์ด ๋’ค์˜ [](int a, int b) { return a & b; }์ด๋‹ค.

์ด๊ฒƒ์€ ๋žŒ๋‹ค ํ•จ์ˆ˜๋กœ transform ํ•จ์ˆ˜์˜ ์ดํ•ญ ์—ฐ์‚ฐ์ž๋กœ ์‚ฌ์šฉ๋œ๋‹ค.

์ด ๋žŒ๋‹ค ํ•จ์ˆ˜๋Š” ๋‘ ๊ฐœ์˜ ์ •์ˆ˜ a์™€ b๋ฅผ ์ธ์ž๋กœ ๋ฐ›์•„์„œ ๋…ผ๋ฆฌ AND(๋น„ํŠธ AND) ์—ฐ์‚ฐ์ธ a & b์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

 

์—„์ฒญ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ง  ์‚ฌ๋žŒ๋“ค๋„ ๋งŽ์€ ๊ฒƒ ๊ฐ™๋‹ค..

๊ทธ๋ฆฌ๊ณ  ํŒŒ์ด์ฌ์œผ๋กœ ํ•˜๋ฉด ๋” ๊ฐ„๋‹จํ–ˆ์„ ๋“ฏ.