지민이는 세계에서 가장 유명한 사람이 누구인지 궁금해졌다. 가장 유명한 사람을 구하는 방법은 각 사람의 2-친구를 구하면 된다. 어떤 사람 A가 또다른 사람 B의 2-친구가 되기 위해선, 두 사람이 친구이거나, A와 친구이고, B와 친구인 C가 존재해야 된다. 여기서 가장 유명한 사람은 2-친구의 수가 가장 많은 사람이다. 가장 유명한 사람의 2-친구의 수를 출력하는 프로그램을 작성하시오.
A와 B가 친구면, B와 A도 친구이고, A와 A는 친구가 아니다.
첫째 줄에 사람의 수 N이 주어진다. N은 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에 각 사람이 친구이면 Y, 아니면 N이 주어진다.
첫째 줄에 가장 유명한 사람의 2-친구의 수를 출력한다.
5
NYNNN
YNYNN
NYNYN
NNYNY
NNNYN
4
const fs = require('fs');
let [N, ...friend] = fs.readFileSync(0, 'utf-8').toString().trim().split('\n');
N = Number(N);
let distance = Array.from({ length: N }, () => Array(N).fill(Infinity));
for (let i = 0; i < N; i++) {
friend[i] = friend[i].trim().split('');
for (let j = 0; j < N; j++) {
if (friend[i][j] === 'Y') distance[i][j] = 1;
}
}
for (let mid = 0; mid < N; mid++) {
for (let start = 0; start < N; start++) {
for (let end = 0; end < N; end++) {
if (start === end) continue;
distance[start][end] = Math.min(distance[start][end], distance[start][mid] + distance[mid][end]);
}
}
}
let max = 0;
for (let i = 0; i < N; i++) {
let count = 0;
for (let j = 0; j < N; j++) {
if (distance[i][j] <= 2) count++;
}
if (max < count) max = count;
}
console.log(max);
for문을 너무 많이 써서 효율적이지는 못할 것 같지만 애초에 시간 제한도 2초이고 N도 작은 편이라 문제 없을거라 생각하고 플로이드 워셜로 풀이했다. 사실 다른 방법으로도 풀이가 가능할 것 같긴했는데 이번에 새로 플로이드 워셜을 공부했으니 그렇게 풀이해보고 싶었다!