-
[백준][Kotlin]1976번 여행 가자백준 2023. 4. 12. 15:01728x90
해당 문제는 유니온 파인드을 이용하여 작성 할 수 있는 문제 였습니다.
저의 경우 헷갈리지 않으려고 도시정보를 저장 하는 배열은 N+1의 size를 가진 IntArray를 생성하여 저장 하였습니다.
여기서 제가 실수를 한번 했었는데 N의 값을 +1을 해서 받은 다음 배열 생성 후 N을 -1 을 한 뒤에 코드가 실행 되도록 작성해야 됬었는데 -1을 안해서 문제의 예제는 잘 돌아갔는데 제출을 하면 NullPointer 에러가 발생하였었습니다.
-1을 코드 작성 시 바로 했어야 됬는데 하지 않아 해당 문제를 찾는데 있어 조금 당혹 스러웠던 경험을 하였습니다.
하기는 제가 작성한 코드와 제출 결과 입니다.
import java.io.BufferedReader import java.io.BufferedWriter import java.io.InputStreamReader import java.io.OutputStreamWriter import java.util.* lateinit var city: IntArray //val bw = BufferedWriter(OutputStreamWriter(System.out)) fun main() { val br = BufferedReader(InputStreamReader(System.`in`)) //val bw = BufferedWriter(OutputStreamWriter(System.out)) var st = StringTokenizer(br.readLine()) var n = st.nextToken().toInt()+1 // 도시 개수 st = StringTokenizer(br.readLine()) var m = st.nextToken().toInt() // 여행 경로 데이터 city = IntArray(n){i: Int -> i} // 도시 정보 n-- //이거 안해서 에러ㅠㅜ for(i in 1 ..n){ st = StringTokenizer(br.readLine()) for(j in 1 .. n){ if(st.nextToken().toInt() == 1){ union(i,j) } } } st = StringTokenizer(br.readLine()) var start = IntArray(m){i: Int -> st.nextToken().toInt()} var check = true for(i in 0 .. start.size-2){ if(city[start[i]] != city[start[i+1]]){ check = false break } } if(check){ println("YES") } else { println("NO") } //bw.flush() //bw.close() } fun union(a:Int,b:Int){ val A = find(a) val B = find(b) if(A != B){ if(A < B){ city[B] = A } else { city[A] = B } } } fun find(a:Int):Int{ if(city[a] == a) return a else { city[a] = find(city[a]) } return city[a] }
'백준' 카테고리의 다른 글
[백준][Kotlin] 2252번 줄 세우기 (0) 2023.04.13 [백준][Kotlin]1043번 거짓말 (0) 2023.04.12 [백준][Kotlin]1717번 집합의 표현 (0) 2023.04.11 [백준][Kotlin] 2042번 구간 합 구하기 (0) 2023.04.10 [백준][Kotlin]2559번 수열 (0) 2023.04.10