친구
문제
지민이는 세계에서 가장 유명한 사람이 누구인지 궁금해졌다. 가장 유명한 사람을 구하는 방법은 각 사람의 2-친구를 구하면 된다. 어떤 사람 A가 또다른 사람 B의 2-친구가 되기 위해선, 두 사람이 친구이거나, A와 친구이고, B와 친구인 C가 존재해야 된다. 여기서 가장 유명한 사람은 2-친구의 수가 가장 많은 사람이다. 가장 유명한 사람의 2-친구의 수를 출력하는 프로그램을 작성하시오.
A와 B가 친구면, B와 A도 친구이고, A와 A는 친구가 아니다.
입력
첫째 줄에 사람의 수 N이 주어진다. N은 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에 각 사람이 친구이면 Y, 아니면 N이 주어진다.
출력
첫째 줄에 가장 유명한 사람의 2-친구의 수를 출력한다.
풀이
각 사람마다 2친구의 수를 구한다.
구하는 방법은 그 사람의 친구 수 + 각 친구마다의 친구 수이다.
주의할 점은 중복을 잘 피해야 한다.
(ex. A의 2친구를 구하는데 (A,B) (A,C) (B,C)가 친구라면 중복될 수 있으므로 이를 유의하면서 푼다.)
코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Main{
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
List<Integer>[] list = new ArrayList[n];
for (int i = 0; i < n; i++) {
list[i] = new ArrayList<>();
String s = br.readLine();
for (int j = 0; j < n; j++) {
if(s.charAt(j) == 'Y')
list[i].add(j);
}
}
int ans = 0;
for (int i = 0; i < n; i++) {
ans = Math.max(ans, find(list, i, n));
}
System.out.println(ans);
}
static int find(List[] list, int num, int n){
boolean[] check = new boolean[n];
int ans = 0;
check[num] = true;
Iterator iter = list[num].iterator();
while (iter.hasNext()) {
int next = (int) iter.next();
if(!check[next]) {
ans++;
check[next] = true;
}
Iterator iterator = list[next].iterator();
while (iterator.hasNext()) {
int friend = (int) iterator.next();
if (!check[friend]) {
ans++;
check[friend] = true;
}
}
}
return ans;
}
}
'알고리즘' 카테고리의 다른 글
1034 램프 (Java) (0) | 2022.04.18 |
---|---|
1052 물병 (Java) (0) | 2022.04.18 |
20056 마법사 상어와 파이어볼 (Java) (0) | 2022.04.15 |
7490 0만들기 (Java) (0) | 2022.04.14 |
1182 부분수열의 합 (Java) (0) | 2022.04.13 |