본문 바로가기

알고리즘

1058 친구 (Java)

친구

문제

지민이는 세계에서 가장 유명한 사람이 누구인지 궁금해졌다. 가장 유명한 사람을 구하는 방법은 각 사람의 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