백준/실버

[백준 1058번] 친구 (C++)

게임개발기원 2025. 3. 2. 01:29

문제링크 : https://www.acmicpc.net/problem/1058

#include <bits/stdc++.h>
using namespace std;

int dist[51][51];

int main(void)
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);

    int n, result = 0;
    cin >> n;
    for(int i=0; i<n; i++)
    {
        for(int j=0; j<n; j++)
        {
            dist[i][j] = INT_MAX;
        }
    }

    for(int i=0; i<n; i++)
    {
        string s;
        cin>> s;
        for(int j=0; j<s.size(); j++)
        {
            if(s[j]=='Y')
            {
                dist[i][j] = 1; //친구 간 거리는 1
            }
        }
    }

    for(int j=0; j<n; j++) // 중간 
    {
        for(int i=0; i<n; i++) // 시작 
        {
            for(int k=0; k<n; k++) // 도착 
            {
                if(dist[i][j] == INT_MAX || dist[j][k] == INT_MAX) continue;
                dist[i][k] = min(dist[i][k], dist[i][j] + dist[j][k]); //거리 갱신신
            }
        }
    }

    //가장 2-친구의 수가 많은 사람 찾기
    for(int i=0; i<n; i++)
    {
        int cnt = 0;
        for(int j=0; j<n; j++)
        {
            if(i==j) continue; //자기 자신 스킵
            if(dist[i][j] <=2) cnt++;
        }
        result = max(result, cnt);
    }
    
    cout << result << '\n';

    return 0;
}

 

플로이드 - 워셜 알고리즘을 통해 풀 수 있는 문제이다.

먼저 배열을 최대값으로 지정하고, 이후에 'Y' 값을 기준으로 해당 거리 ij에 대해서 초기 거리 1을 설정해준다.

 

이제 플로이드 워셜 알고리즘을 통해서 가능한 케이스에 대해 거리를 갱신해준다.

거리를 갱신했으면 이제 가장 2-친구의 수가 많은 사람을 찾을 차례이다.

 

브루트포스를 통하여 자기 자신의 경우에는 스킵하고, ij의 거리가 2이하인 경우에 대해 카운팅하고 카운팅한 값 중 가장 큰 값을 출력해준다.