프로그래머스
[프로그래머스][Kotlin] 부대복귀
끝까지 처음처럼
2023. 3. 9. 16:13
728x90
해당 문제는 BFS를 이용하여 풀 수 있습니다.
해당 문제를 작성하면서 처음에 작성하였었던 코드가 시간 초과가 나왔었습니다.
원인을 처음에는 못찾았었지만 문제 설명, 제한사항, 입출력 예등을 보다 보니 제가 처음에 작성한 코드가 시간 초과가 날 수밖에 없는 이유를 찾았었습니다. 제가 bfs를 sources의 size 만큼 돌리면서 길이를 찾는 코드를 작성 했었기 때문입니다.
문제의 설명을 자세히 보지 않아 destination 으로부터의 거리를 구하면 되는 문제를 각 출발 지점부터의 destination 거리를 쓸데 없이 bfs를 더욱 반복하여 시간 초과가 나왔던 것입니다.
앞으로는 문제를 대충 읽어 작성 및 디버깅 시간이 늘어나는 실수를 하지 않도록 해야겠다는 생각을 하게 되었습니다.하기는 제가 작성한 코드와 실행 결과 입니다.
import java.util.*
import kotlin.collections.ArrayList
class Solution {
fun solution(n: Int, roads: Array<IntArray>, sources: IntArray, destination: Int): IntArray {
var answer = intArrayOf()
var roadList = ArrayList<ArrayList<Int>>()
repeat(n+1){
roadList.add(ArrayList())
}
for(i in 0 .. roads.size-1){
roadList[roads[i][0]].add(roads[i][1])
roadList[roads[i][1]].add(roads[i][0])
}
var lenCount = IntArray(n+1){-1}
var dq = ArrayDeque<Int>()
dq.addFirst(destination)
lenCount[destination] = 0
while(!dq.isEmpty()){
val now = dq.pollFirst()
for(nextRoad in roadList[now]){
if(lenCount[nextRoad] == -1){
dq.addLast(nextRoad)
lenCount[nextRoad] = lenCount[now]+1
}
}
}
sources.forEach {
answer += lenCount[it]
}
return answer
}
}
테스트 1 〉 | 통과 (10.05ms, 63.7MB) |
테스트 2 〉 | 통과 (9.62ms, 63MB) |
테스트 3 〉 | 통과 (13.30ms, 65.2MB) |
테스트 4 〉 | 통과 (10.47ms, 63.5MB) |
테스트 5 〉 | 통과 (9.46ms, 63.3MB) |
테스트 6 〉 | 통과 (30.50ms, 84.6MB) |
테스트 7 〉 | 통과 (37.93ms, 80.8MB) |
테스트 8 〉 | 통과 (35.02ms, 86MB) |
테스트 9 〉 | 통과 (31.12ms, 76.1MB) |
테스트 10 〉 | 통과 (30.82ms, 76.3MB) |
테스트 11 〉 | 통과 (149.47ms, 161MB) |
테스트 12 〉 | 통과 (243.31ms, 158MB) |
테스트 13 〉 | 통과 (192.23ms, 159MB) |
테스트 14 〉 | 통과 (192.56ms, 160MB) |
테스트 15 〉 | 통과 (137.54ms, 162MB) |
테스트 16 〉 | 통과 (47.50ms, 98.9MB) |