문제 풀이/백준

[백준] 1058번. 친구(JAVA)

27200 2025. 1. 9. 15:39

문제

https://www.acmicpc.net/problem/1058


풀이(21분)

import java.io.*;
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());
        boolean[][] friend = new boolean[n][n];

        HashMap<Integer, Set<Integer>> map = new HashMap<>();

        for(int i = 0; i < n; i++){
            String input = br.readLine();
            Set<Integer> set = new HashSet<>();
            map.put(i, set);
            for(int j = 0; j < n; j++){
                if(input.charAt(j) == 'Y'){
                    friend[i][j] = true;
                    map.get(i).add(j);
                }
            }
        }

        for(int i = 0; i < n; i++){
            for(int j = 0; j < n; j++){
                if(friend[i][j]){
                    for(int k = 0; k < n; k++){
                        if(friend[j][k] && i != k){
                            map.get(i).add(k);
                        }
                    }
                }
            }
        }

        int answer = 0;
        for(int i = 0; i < n; i++){
            answer= Math.max(answer, map.get(i).size());
        }

        System.out.println(answer);
    }
}

 

HashMap을 통해 한 명마다 각 2 친구를 저장할 수 있는 집합을 만든다. 집합으로 선언하는 이유는 중복되더라도 자동적으로 처리되게 만들기 위해서이다.

 

이후 입력을 받으며 각 직접 연관된 친구를 모두 체크해두고, 나머지 친구의 친구를 체크하는 방식을 이용했다.

 

하지만, 실제로는 set의 이터레이터를 이용해서 친구의 친구를 체크할 때 더욱 효율적인 방식을 활용할 수 있을 것 같다.