베오
DCode
베오
전체 방문자
오늘
어제
  • 분류 전체보기 (218)
    • 공지사항 (1)
    • 잡설 (1)
    • Programming (33)
      • [C] (1)
      • [Java] (4)
      • [Python] (2)
      • [Android] (2)
      • [Network] (0)
      • [Operation System] (2)
      • [Spring Boot] (22)
      • [Docker] (0)
    • Algorithm (31)
      • 자료구조 (2)
      • 알고리즘 (Java) (14)
      • 알고리즘 (기초) (15)
    • Coding Test (131)
      • BOJ (131)
      • Algospat (0)
    • 이론적인거 (14)
      • 보안 (5)
      • 오류 해결 (2)
      • 디자인 패턴 (5)
      • 네트워크 (1)
      • 기타 (1)
    • 최신기술 (4)
      • 블록체인 (1)
    • [Project] (1)

블로그 메뉴

  • 🐈‍⬛ GitHub
  • 📫 방명록
  • 🔖 태그

공지사항

인기 글

티스토리

hELLO · Designed By 정상우.
베오

DCode

Coding Test/BOJ

[BOJ/JAVA] 4195번: 친구 네트워크

2022. 8. 21. 10:25

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

 

4195번: 친구 네트워크

첫째 줄에 테스트 케이스의 개수가 주어진다. 각 테스트 케이스의 첫째 줄에는 친구 관계의 수 F가 주어지며, 이 값은 100,000을 넘지 않는다. 다음 F개의 줄에는 친구 관계가 생긴 순서대로 주어진

www.acmicpc.net

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.HashMap;
import java.util.StringTokenizer;
import java.util.Vector;

public class java_4195 {
    // 테스트 케이스
    static int T;
    // 친구 관계의 수
    static int F;
    // <이름,인덱스>
    static HashMap<String, Integer> friendMap;

    static class DisjointSet {
        // parent : 각 노드의 부모 위치
        Vector<Integer> parent;
        // rank : 각 노드의 높이
        Vector<Integer> rank;

        public DisjointSet(int n) {
            parent = new Vector<>();
            rank = new Vector<>();

            // 노드 수 만큼 반복
            for (int i = 0; i < n; i++) {
                // 처음은 자기 자신이 부모
                parent.add(i);
                // 높이는 1로 초기화
                rank.add(1);
            }
        }

        // u가 속한 트리의 루트 번호를 반환한다.
        public int find(int u) {
            // 루트 번호면 자기 자신이므로 끝남.
            if (u == parent.get(u)) {
                return u;
            }

            // 루트 번호 갱신
            int ret = find(parent.get(u));
            parent.set(u, ret);

            // 랭크 갱신
            rank.set(u, rank.get(ret));

            return ret;
        }

        // u가 속한 트리와 v가 속한 트리를 합친다.
        public void merge(int u, int v) {
            // u, v의 각각 루트 노드 구하기
            u = find(u);
            v = find(v);

            // u, v가 같은 트리에 속한다면...
            // 바로 종료
            if (u == v) {
                return;
            }

            // 친구 네트워크에서 연결된 친구 수를 구해야 하므로
            // 두 랭크를 더하자
            // v+u 를 하자
            if (rank.get(u) > rank.get(v)) {
                int tmp = u;
                u = v;
                v = tmp;
            }

            // System.out.println("first Rank : " + rank.get(u));
            // System.out.println("second Rank : " + rank.get(v));
            int tmpRank = rank.get(u) + rank.get(v);

            // u의 루트를 v루트 뒤에 붙인다.
            parent.set(u, v);

            rank.set(v, tmpRank);
            rank.set(u, tmpRank);
        }
    }

    public static void main(String[] args) throws IOException {
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        T = Integer.parseInt(br.readLine());

        for (int testCase = 0; testCase < T; testCase++) {
            // 친구 관계의 수
            F = Integer.parseInt(br.readLine());

            // frient 인덱스 초기화
            int friendIndex = 0;
            // 프렌드 맵 초기화
            friendMap = new HashMap<>();
            DisjointSet disjointSet = new DisjointSet(F * 2);

            for (int i = 0; i < F; i++) {
                StringTokenizer st = new StringTokenizer(br.readLine());
                String firstFriend = st.nextToken();
                String secondFriend = st.nextToken();

                // 존재하지 않으면 일단 삽입하기
                if (friendMap.get(firstFriend) == null) {
                    friendMap.put(firstFriend, friendIndex++);
                }
                if (friendMap.get(secondFriend) == null) {
                    friendMap.put(secondFriend, friendIndex++);
                }

                disjointSet.merge(friendMap.get(firstFriend), friendMap.get(secondFriend));

                bw.write(disjointSet.rank.get(disjointSet.find(friendMap.get(firstFriend))) + "\n");

            }

        }

        br.close();
        bw.close();
    }
}
저작자표시 (새창열림)

'Coding Test > BOJ' 카테고리의 다른 글

[BOJ/JAVA] 4920 테트리스 게임  (0) 2022.08.21
[BOJ/JAVA] 3085번: 사탕 게임  (0) 2022.08.21
[BOJ/JAVA] 5021번: 왕위 계승  (0) 2022.08.21
[java] 2015번: 수들의 합 4  (0) 2022.08.20
[java] 23293번: 아주 서바이벌  (0) 2022.08.20
    'Coding Test/BOJ' 카테고리의 다른 글
    • [BOJ/JAVA] 4920 테트리스 게임
    • [BOJ/JAVA] 3085번: 사탕 게임
    • [BOJ/JAVA] 5021번: 왕위 계승
    • [java] 2015번: 수들의 합 4
    베오
    베오

    티스토리툴바