-
[백준][Kotlin]16562번 친구비백준 2023. 4. 17. 16:38728x90
해당 문제는 유니온파인드를 이용하여 작성할 수 있습니다.
코드를 작성하기 위한 포인트로는 친구들의 관계를 입력 받을 때 union 함수를 이용하여 미리 친구들의 관계를 합치는 것과 합칠 때 해당 둘 중 친구비가 더욱 적은 친구를 대표노드로 만들어 놓는 것입니다.
그리고 모든 입력을 받은 후 본인(이준석,0)과 union 함수를 이용하여 자신과 다른 대표 노드를 가지고 있는 친구들의 한하여 비교 및 친구비 계산을 하여 출력하면 됩니다.
하기는 제가 작성한 코드와 제출 결과 입니다.
import java.io.BufferedReader import java.io.BufferedWriter import java.io.InputStreamReader import java.io.OutputStreamWriter import java.util.* lateinit var friend: IntArray lateinit var money: IntArray fun main() { val br = BufferedReader(InputStreamReader(System.`in`)) //val bw = BufferedWriter(OutputStreamWriter(System.out)) var st = StringTokenizer(br.readLine()) val n = st.nextToken().toInt() val m = st.nextToken().toInt() val k = st.nextToken().toInt() // 가지고 있는 돈 friend = IntArray(n+1){i: Int -> i } money = IntArray(n+1){0} st = StringTokenizer(br.readLine()) for(i in 1 .. n){ money[i] = st.nextToken().toInt() } for(i in 1 .. m){ st = StringTokenizer(br.readLine()) var fr1 = st.nextToken().toInt() var fr2 = st.nextToken().toInt() union(fr1,fr2) } var sum = 0 for(i in friend){ if(0 != find(i)){ sum += money[find(i)] // 대표 노드의 돈을 확인 후 +연산을 해야함~! union(0,i) } } if(sum > k) println("Oh no") else println(sum) //bw.flush() //bw.close() } fun find(a:Int):Int{ if(friend[a] == a) return a friend[a] = find(friend[a]) return friend[a] } fun union(a:Int,b:Int){ var x = find(a) var y = find(b) if(x != y){ if(money[x] <= money[y]){ friend[y] = x } else { friend[x] = y } } }
'백준' 카테고리의 다른 글
[백준][Kotlin]1753 최단경로 (0) 2023.04.20 [백준][Kotlin]1948번 임계경로 (0) 2023.04.19 [백준][Kotlin] 1516번 게임 개발 (0) 2023.04.14 [백준][Kotlin] 2252번 줄 세우기 (0) 2023.04.13 [백준][Kotlin]1043번 거짓말 (0) 2023.04.12