알고리즘
백준 1058번 친구 (JAVA)
박카스마시며코딩
2021. 11. 28. 20:25
https://www.acmicpc.net/problem/1058
1058번: 친구
지민이는 세계에서 가장 유명한 사람이 누구인지 궁금해졌다. 가장 유명한 사람을 구하는 방법은 각 사람의 2-친구를 구하면 된다. 어떤 사람 A가 또다른 사람 B의 2-친구가 되기 위해선, 두 사람
www.acmicpc.net
저는 플루이드-워샬 알고리즘을 활용하여 2-칭구를 찾았습니다.
플루이드-워샬은 n^3방법으로 비효율적일 수 있지만 코드가 간결하고 입력값이 50이라 시간초과가 나지 않을 것이라 판단하여 사용하였습니다.
마지막으로 각 행에 대한 Y를 찾고 이 수가 가장 큰 값을 결과로 출력하였습니다.
package BOJ;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
import java.util.function.Function;
public class BOJ_1058 {
static boolean map[][];
static int n;
static int cal(){
boolean[][] temp = new boolean[n][n];
for(int k = 0 ; k < n ; k++){
for(int i = 0; i < n; i++){
for(int j = 0; j <n ; j++){
if(i != j && !map[i][j] && map[i][k] && map[k][j]){
temp[i][j] = true;
}
}
}
}
int result = 0;
for(int i = 0; i < n; i++){
int sum = 0;
for(int j = 0; j <n ; j++){
if(map[i][j] || temp[i][j]){
sum++;
}
}
result = Math.max(sum,result);
}
return result;
}
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine()," ");
Function<String,Integer> stoi = Integer::parseInt;
n = stoi.apply(st.nextToken());
map = new boolean[n][n];
for(int i = 0; i < n; i++){
String command = br.readLine();
for(int j = 0; j <n ; j++){
char now = command.charAt(j);
if('Y' == now){
map[i][j] = true;
}else{
map[i][j] = false;
}
}
}
System.out.println(cal());
}
}