백준 온라인 저지/Silver

[BOJ] 1058 - 친구

jooona 2021. 2. 18. 22:40
반응형

개인적인 풀이일 뿐, 최적의 정답이 아님을 알려드립니다.

 

문제

www.acmicpc.net/problem/1058

 

1058번: 친구

지민이는 세계에서 가장 유명한 사람이 누구인지 궁금해졌다. 가장 유명한 사람을 구하는 방법은 각 사람의 2-친구를 구하면 된다. 어떤 사람 A가 또다른 사람 B의 2-친구가 되기 위해선, 두 사람

www.acmicpc.net

난이도: 실버 1

사용언어: JAVA

 

풀이

백준에 나와있는 알고리즘 분류에는 DFS나 플로이드-와샬과 같은 알고리즘도 적혀있지만, 가장 해결하기 쉬운 방법은 그냥 브루트포스로 접근하는 것입니다.

 

우선 입력으로부터 친구들을 모두 구하고, 해당 친구들의 친구까지 확인하여 카운팅 해주기만 하면 됩니다.

 

코드의 주석을 보는 것이 이해하기 편할 것 같습니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
import java.io.*;
import java.util.Arrays;
 
class Main {
 
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
 
        int N = Integer.parseInt(br.readLine());
        int i, j, k;
        char[][] arr = new char[N][N]; // 입력을 저장하는 배열
        int[] result = new int[N]; // 각 노드의 친구의 수를 저장
        int[][] mark = new int[N][N]; // 친구로 이미 등록했는지를 체크
        String s;
        for (i = 0; i < N; i++) {
            s = br.readLine();
            for (j = 0; j < N; j++) {
                arr[i][j] = s.charAt(j);
            }
        }
 
        for (i = 0; i < N; i++) {
            for (j = 0; j < N; j++) {
                if (arr[i][j] == 'Y') { // 자기 자신과 친구면
                    if (mark[i][j] == 0) {
                        result[i]++; // 친구 수 +1 해주고,
                        mark[i][j] = 1; // 친구로 체크해준다
                    }
                    for (k = 0; k < N; k++) { // 그리고 친구의 친구를 구하기 위해
                        if (arr[j][k] == 'Y' && mark[i][k] == 0 && i != k) { // 친구의 친구가 존재하고, 아직 체크하지 않았으며, 친구의 친구가 내가 아닐때,
                            result[i]++; // 친구 수 +1
                            mark[i][k] = 1; // 친구로 체크
                        }
                    }
                }
            }
        }
 
        Arrays.sort(result);
        bw.write(String.valueOf(result[N - 1])); // 소팅해서 가장 큰 값 출력
        bw.flush();
    }
}
cs

 

반응형

'백준 온라인 저지 > Silver' 카테고리의 다른 글

[BOJ] 15988 - 1, 2, 3 더하기 3  (0) 2021.02.20
[BOJ] 11659 - 구간 합 구하기 4  (0) 2021.02.18
[BOJ] 1992 - 쿼드트리  (0) 2021.02.17
[BOJ] 11660 - 구간 합 구하기 5  (1) 2021.02.17
[BOJ] 2877 - 4와 7  (0) 2021.02.15