문제
지민이는 세계에서 가장 유명한 사람이 누구인지 궁금해졌다. 가장 유명한 사람을 구하는 방법은 각 사람의 2-친구를 구하면 된다. 어떤 사람 A가 또다른 사람 B의 2-친구가 되기 위해선, 두 사람이 친구이거나, A와 친구이고, B와 친구인 C가 존재해야 된다. 여기서 가장 유명한 사람은 2-친구의 수가 가장 많은 사람이다. 가장 유명한 사람의 2-친구의 수를 출력하는 프로그램을 작성하시오.
A와 B가 친구면, B와 A도 친구이고, A와 A는 친구가 아니다.
입력
첫째 줄에 사람의 수 N이 주어진다. N은 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에 각 사람이 친구이면 Y, 아니면 N이 주어진다.
출력
첫째 줄에 가장 유명한 사람의 2-친구의 수를 출력한다.
예제 입력 1
3
NYY
YNY
YYN
예제 출력 1
2
예제 입력 2
3
NNN
NNN
NNN
예제 출력 2
0
예제 입력 3
5
NYNNN
YNYNN
NYNYN
NNYNY
NNNYN
예제 출력 3
4
예제 입력 4
10
NNNNYNNNNN
NNNNYNYYNN
NNNYYYNNNN
NNYNNNNNNN
YYYNNNNNNY
NNYNNNNNYN
NYNNNNNYNN
NYNNNNYNNN
NNNNNYNNNN
NNNNYNNNNN
예제 출력 4
8
예제 입력 5
15
NNNNNNNNNNNNNNY
NNNNNNNNNNNNNNN
NNNNNNNYNNNNNNN
NNNNNNNYNNNNNNY
NNNNNNNNNNNNNNY
NNNNNNNNYNNNNNN
NNNNNNNNNNNNNNN
NNYYNNNNNNNNNNN
NNNNNYNNNNNYNNN
NNNNNNNNNNNNNNY
NNNNNNNNNNNNNNN
NNNNNNNNYNNNNNN
NNNNNNNNNNNNNNN
NNNNNNNNNNNNNNN
YNNYYNNNNYNNNNN
예제 출력 5
6
알고리즘 분류
- 그래프 탐색
풀이
1부터 N까지 DFS를 각각 실행하여 거리가 2 이하인 노드의 수의 최댓값을 찾는다. N이 최대 50이고, 깊이는 최대 2이기 때문에 최악의 경우에도 DFS를 많이 실행하지 않는다.
코드
#include <iostream>
#include <string>
#include <cmath>
#include <set>
#include <map>
#include <stack>
#include <queue>
#include <vector>
#include <algorithm>
#include <climits>
#define FIRST cin.tie(NULL); cout.tie(NULL); ios::sync_with_stdio(false);
#define MAX 51
#define K_MAX 126
#define LL long long
#define INF 2e9
using namespace std;
int N;
char MAP[MAX][MAX];
vector<int> Vec[MAX];
bool visited[MAX];
int answer = -1;
void init() {
for (int i = 0; i < MAX; i++) {
visited[i] = false;
}
}
void DFS(int Depth, int X) {
visited[X] = true;
if (Depth == 2) {
return;
}
for (int i = 0; i < Vec[X].size(); i++) {
int nextX = Vec[X][i];
DFS(Depth + 1, nextX);
}
}
int Two_Friends() {
int res = 0;
for (int i = 1; i <= N; i++) {
if (visited[i]) {
res++;
}
}
return res;
}
int main() {
FIRST
cin >> N;
for (int i = 1; i <= N; i++) {
string S;
cin >> S;
for (int j = 1; j <= N; j++) {
MAP[i][j] = S[j - 1];
if (MAP[i][j] == 'Y') {
Vec[i].push_back(j);
}
}
}
for (int i = 1; i <= N; i++) {
init();
DFS(0, i);
answer = max(answer, Two_Friends());
}
cout << answer - 1 << "\n";
return 0;
}
'BOJ > Silver' 카테고리의 다른 글
[BOJ/Silver 2] 백준 5177 출력 형식이 잘못되었습니다(C++) (0) | 2022.03.16 |
---|---|
[BOJ/Silver 3] 백준 20291 파일 정리(C++) (0) | 2022.03.15 |
[BOJ/Silver 1] 백준 19583 싸이버개강총회(C++) (0) | 2022.03.15 |
[BOJ/Silver 2] 백준 17086 아기 상어 2(C++) (0) | 2022.02.05 |
[BOJ/Silver 2] 백준 11060 점프 점프(C++) (0) | 2022.02.05 |