반응형
https://www.acmicpc.net/problem/1058
시간 제한 | 메모리 제한 | 제출 | 정답 | 맞은 사람 | 정답 비율 |
---|---|---|---|---|---|
2 초 | 128 MB | 5873 | 2108 | 1734 | 36.815% |
문제
지민이는 세계에서 가장 유명한 사람이 누구인지 궁금해졌다. 가장 유명한 사람을 구하는 방법은 각 사람의 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
코드
/**
* BOJ 1058 친구 : Silver 2
* 플로이드와샬
*/
import java.io.*;
import java.util.*;
public class p1058 {
static int n;
static int[][] map;
static final int INF = 987654321;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
n = Integer.parseInt(br.readLine());
map = new int[n + 1][n + 1];
for (int i = 1; i <= n; i++) {
String line = br.readLine();
for (int j = 1; j <= n; j++) {
if (i == j) continue;
if (line.charAt(j - 1) == 'Y') {
map[i][j] = 1;
} else {
map[i][j] = INF;
}
}
}
floydWarshall();
int answer = 0;
for (int i = 1; i <= n; i++) {
int cnt = 0;
for (int j = 1; j <= n; j++) {
if (i == j) continue;
if (map[i][j] <= 2) {
cnt++;
}
}
answer = Math.max(answer, cnt);
}
System.out.println(answer);
}
static void floydWarshall() {
for (int k = 1; k <= n; k++) {
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if (i == j || j == k || k == i) continue;
map[i][j] = Math.min(map[i][j], map[i][k] + map[k][j]);
}
}
}
}
}
반응형
'알고리즘 > [ Baekjoon ]' 카테고리의 다른 글
[ BOJ ][JAVA][20444] 색종이와 가위 (0) | 2021.10.25 |
---|---|
[ BOJ ][JAVA][1757] 달려달려 (0) | 2021.10.25 |
[ BOJ ][JAVA][20208] 진우의 민트초코우유 (0) | 2021.10.21 |
[ BOJ ][JAVA][2847] 게임을 만든 동준이 (0) | 2021.10.21 |
[ BOJ ][JAVA][20168] 골목 대장 호석 (0) | 2021.09.07 |