[백준] 4195번: 친구 네트워크 - Kotlin[코틀린]

2023. 11. 6. 21:54·알고리즘/Baekjoon

문제

 

 

4195번: 친구 네트워크

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

www.acmicpc.net

 


풀이

 

 입력된 친구 관계를 해시맵과 유니온 파인드(Union-Find)을 활용해 풀이하면 된다. 해시맵은 <String, Int>형으로 선언하여 이름과 이름에 대한 번호를 대응시킨다. 이름을 입력받을 때마다 해시맵에 없다면 새로운 번호를 할당한다. 이 번호는 유니온 파인드에서 각 노드의 루트 노드가 된다.

 

 유니온 파인드에서는 루트 노드를 저장하는 배열과 해당 그룹에 속한 친구들의 수를 저장하는 배열을 같이 이용한다. 합집합 연산을 통해 루트 노드를 변경해주고 그에 따라 친구의 수를 합쳐주면 된다.

 

 입력받은 이름들을 유니온 연산하고 그룹별로 친구들의 수를 출력해주면 된다.

 


코드

 

import java.util.*

fun main() {
    val br = System.`in`.bufferedReader()
    val bw = System.out.bufferedWriter()

    lateinit var parent: IntArray // 루트 노드
    lateinit var friends: IntArray // 친구의 수

    fun find(a: Int): Int {
        return if(a == parent[a]) a
        else {
            parent[a] = find(parent[a])
            parent[a]
        }
    }
    fun union(a: Int, b: Int) : Int {
        val x = find(a)
        val y = find(b)

        if(x!=y) {
            parent[y] = x
            friends[x] += friends[y]
        }
        return friends[x]
    }

    val sb = StringBuilder()
    repeat(br.readLine().toInt()) {
        val num = br.readLine().toInt()
        parent = IntArray(num*2){ it }
        friends = IntArray(num*2){ 1 }

        val hashMap = HashMap<String, Int>()
        var idx = 0 // 번호
        for(i in 0 until num) {
            val st = StringTokenizer(br.readLine())
            val a = st.nextToken()
            val b = st.nextToken()

            if(!hashMap.containsKey(a)) {
                hashMap[a] = idx++
            }
            if(!hashMap.containsKey(b)) {
                hashMap[b] = idx++
            }

            sb.append("${union(hashMap[a]!!, hashMap[b]!!)}\n")
        }
    }

    bw.write(sb.toString())
    bw.flush()
    bw.close()
    br.close()
}

 

 

'알고리즘 > Baekjoon' 카테고리의 다른 글

[백준] 9372번: 상근이의 여행 - Kotlin[코틀린]  (0) 2023.11.08
[백준] 20040번: 사이클 게임 - Kotlin[코틀린]  (0) 2023.11.07
[백준] 1976번: 여행 가자 - Kotlin[코틀린]  (1) 2023.11.03
[백준] 1922번: 네트워크 연결 - Kotlin[코틀린]  (0) 2023.11.01
[백준] 1717번: 집합의 표현 - Kotlin[코틀린]  (0) 2023.10.31
'알고리즘/Baekjoon' 카테고리의 다른 글
  • [백준] 9372번: 상근이의 여행 - Kotlin[코틀린]
  • [백준] 20040번: 사이클 게임 - Kotlin[코틀린]
  • [백준] 1976번: 여행 가자 - Kotlin[코틀린]
  • [백준] 1922번: 네트워크 연결 - Kotlin[코틀린]
junghoooooon
junghoooooon
  • junghoooooon
    코드팁스
    junghoooooon
  • 전체
    오늘
    어제
    • 전체 (120)
      • 안드로이드 (0)
        • 코드팁스 (0)
      • 유니티 (0)
        • 코드팁스 (0)
      • 알고리즘 (118)
        • 알고리즘 (0)
        • Baekjoon (118)
      • GitHub (0)
      • 티스토리 (2)
  • 블로그 메뉴

    • 링크

    • 공지사항

    • 인기 글

    • 태그

      스택
      정렬
      그리디
      구현
      큐
      MST
      이분 탐색
      티스토리
      백트래킹
      dfs
      그래프이론
      재귀
      크루스칼
      수학
      브루트포스
      에라토스테네스의 체
      BFS
      투 포인터
      그래프 탐색
      프림
      모듈러 곱셈 역원
      우선순위 큐
      문자열
      피보나치
      분할 정복
      DP
      소수 판정
      분리집합
      누적 합
      유니온파인드
    • hELLO· Designed By정상우.v4.10.2
    junghoooooon
    [백준] 4195번: 친구 네트워크 - Kotlin[코틀린]
    상단으로

    티스토리툴바