ํน์ ๊ฑฐ๋ฆฌ์ ๋์ ์ฐพ๊ธฐ(18352๋ฒ)
Silver 2
#๊ทธ๋ํ ์ด๋ก #๊ทธ๋ํ ํ์ #๋๋น ์ฐ์ ํ์ #์ต๋จ ๊ฒฝ๋ก #๋ฐ์ดํฌ์คํธ๋ผ
https://www.acmicpc.net/problem/18352
๋ฌธ์ ๋ด์ฉ
๋ฌธ์ ์ ๊ทผ
๋์์ ๊ฐ์, ๋๋ก์ ๊ฐ์, ๊ตฌํด์ผ ํ๋ ์ต๋จ ๊ฑฐ๋ฆฌ์ ์์ ์ง์ ์ด ์ฃผ์ด์ง ๋, ์์ ์ง์ ๋์์์ ๋ค๋ฅธ ๋์๋ก ์ด๋ํ๋ ์ต๋จ ๊ฑฐ๋ฆฌ๊ฐ ์ ๋ ฅ๋ฐ์ ์ต๋จ ๊ฑฐ๋ฆฌ์ ๊ฐ์ ๋์ ๋ฒํธ๋ง ์ถ๋ ฅํ๋ค. ์กฐ๊ฑด์ ๋ง๋ ๋์๊ฐ ์์ผ๋ฉด -1์ ์ถ๋ ฅ.
๋์๋ ๋ชจ๋ 1~N๊น์ง๊ฐ ์๋ค. ๋๋ก์ ๊ธธ์ด๋ ๋ชจ๋ 1์ผ ๋, ์ต๋จ ๊ฒฝ๋ก ์ ๋ ฅ๊ฐ์ K๋ผ๊ณ ํ ๋, ์ถ๋ฐ ๋์์์ ๊ฐ ๋์๋ก ์ด๋ํ๋ ์ต๋จ ๊ฒฝ๋ก๊ฐ K์ ๊ฐ์ ๋์๋ง ์ถ๋ ฅํ๋ค.
bfs๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.
bfs๋ฅผ ์ฐ๊ธฐ ์ํด์๋ ์ด์จ๋ ๊ทธ๋ํ๊ฐ ์์ด์ผ ํ๋ค.
4 4 2 1
1 2
1 3
2 3
2 4
์ด ์ ๋ ฅ ์์ ๋ก ์ด๋ป๊ฒ ๊ทธ๋ํ๋ฅผ ๊ตฌ์ฑํด์ผ ํ ๊น?
๊ทธ๋ํ๋ ๊ฐ ๋์์ ์ฐ๊ฒฐ๋์ด ์๋ ๋ค๋ฅธ ๋์๋ค์ ์ ๋ณด๋ค์ ์ ์ฅํ๋ ํํ๋ก ๊ตฌ์ฑํ๋ฉด ๋๋ค.
์์ ์ ๋ ฅ ์์ ๋ฅผ ๊ธฐ์ค์ผ๋ก๋
- ๋์ 1์๋ 2, 3
- ๋์ 2์๋ 3, 4
- ๋์ 3์ ์์
- ๋์ 4๋ ์์
๋ค์๊ณผ ๊ฐ์ด ๊ทธ๋ํ๋ฅผ ๊ตฌ์ฑํด ์ค ์ ์๋ค.
๊ทธ๋ฌ๋ฉด ์ฌ์ง 1-1์ ๊ฒฐ๊ณผ๋ฅผ 2์ค list๋ก ๋ํ๋ผ ์ ์๋ค.
๋๋ก์ ๋ฐฉํฅ์ด ๋จ๋ฐฉํฅ์ด๋ค. ํ ๋ฒ ๋ ๋ ๋์๋ ๋ค์๋ ๋ฐฉ๋ฌธํ๋ฉด ๋ฐฉ๋ฌธํ ์ ์์ด์ผ ํ๋ค. ๋ค์ ๋ฐฉ๋ฌธํ ์ ์์ผ๋ฉด ์ต๋จ ๊ฑฐ๋ฆฌ๊ฐ ์๋๊ฒ ๋๊ธฐ ๋๋ฌธ์ด๋ค.
์๋ฅผ ๋ค์ด 1 -> 3์ผ๋ก ๊ฑฐ๋ฆฌ๊ฐ 1์ธ ๊ฒฝ์ฐ์ 1 -> 2 -> 3์ผ๋ก ๊ฑฐ๋ฆฌ๊ฐ 2์ธ ๊ฒฝ์ฐ ์ด 2๊ฐ๊ฐ ์๋๋ฐ ๋์ 3์ผ๋ก ๊ฐ๋ ์ต๋จ ๊ฒฝ๋ก๋ 1์ด ๋์ด์ผ ํ๋ค. ๊ทธ๋์ ์ฌ๋ฐฉ๋ฌธ์ ๋ง์ ์ฃผ์ด์ผ ํ๋ค.
๋ฌธ์ ํด๊ฒฐ ์ฝ๋
import java.io.BufferedReader
import java.io.InputStreamReader
import java.util.LinkedList
import java.util.Queue
private var cities = arrayOf(mutableListOf<Int>())
private var visited = booleanArrayOf()
private val answer = mutableListOf<Int>()
private var city = 0
private var road = 0
private var minDistance = 0
fun main() = with(BufferedReader(InputStreamReader(System.`in`))) {
val input = readLine().split(" ").map { it.toInt() }
val start = input[3]
city = input[0]
road = input[1]
minDistance = input[2]
cities = Array(city + 1) { mutableListOf() }
visited = BooleanArray(city + 1)
for (i in 0 until road) {
val roadInfo = readLine().split(" ").map { it.toInt() }
val roadStart = roadInfo[0]
val roadEnd = roadInfo[1]
cities[roadStart].add(roadEnd)
}
bfs(start)
answer.sort()
if (answer.isEmpty()) println(-1)
else println(answer.joinToString("\n"))
}
private fun bfs(start: Int) {
val queue: Queue<List<Int>> = LinkedList()
queue.add(listOf(start, 0))
visited[start] = true
while (queue.isNotEmpty()) {
val data = queue.poll()
val beforeCity = data[0]
val currentDistance = data[1]
if (currentDistance == minDistance) answer.add(beforeCity)
for (i in cities[beforeCity]) {
if (!visited[i]) {
visited[i] = true
queue.add(listOf(i, currentDistance + 1))
}
}
}
}
๋ฌธ์ ํ์ด
๊ทธ๋ํ๋ฅผ cities๋ก ์ ์ํ๊ณ ์ ๋ ฅ๋ฐ์ผ๋ฉด์ ๊ทธ๋ํ๋ฅผ ์ ์ํ๊ณ ๋ฐฉ๋ฌธ ์ฌ๋ถ๋ visited๋ก ์ค์ ํด ์ค๋ค.
visited๋ฅผ 2์ค ๋ฆฌ์คํธ๋ก ์ค์ ํ์ง ์์ ์ด์ ๋ ํ์ฌ ๋์์ ๋ฐฉ๋ฌธ ์ฌ๋ถ๋ง ํ๋จํ๋ฉด ๋๊ธฐ ๋๋ฌธ์ 2์ค ๋ฆฌ์คํธ๋ก ๊ตฌ์ฑํ ํ์๊ฐ ์์ด์ ์ด๋ค.
bfs๋ฅผ ์ฌ์ฉํด์ ๊ฐ ๋์ ๊ฐ์ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํด์ค๋ค.
์ฐ์ ์์ ๋์๋ ์ต๋จ ๊ฑฐ๋ฆฌ๊ฐ 0์ด๊ธฐ ๋๋ฌธ์, queue์ ๋์ ๋ฒํธ์ 0์ ์ ์ฅํ๋ค. ์ด์ 0์ด 1์ฉ ๋ํด์ง๋ฉด์ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ๊ตฌํ๊ฒ ๋ ๊ฒ์ด๋ค.
์ด์ ๋์์์ ๋ค์ ๋์๋ก ๊ฐ ์ ์๋ ๋ชจ๋ ๊ฒฝ๋ก๋ฅผ for๋ฌธ์ผ๋ก ํ์ํ๊ณ ๋ฐฉ๋ฌธํ์ง ์์ ๋์์ผ ๋๋ง queue์ ๋ฃ์ด ์ฃผ๋ ์์ ์ ์งํํ๋ค.
๊ทธ๋ฆฌ๊ณ queue์์ ๊บผ๋ด์จ ๊ฐ์ ์ต๋จ ๊ฒฝ๋ก๊ฐ ํ์ฌ ์ฐ๋ฆฌ๊ฐ ๊ตฌํด์ผ ํ๋ ์ต๋จ ๊ฒฝ๋ก์ธ minDistance์ ์ผ์นํ๋ค๋ฉด answer์ ์ถ๊ฐํ๋ค.
answer๋ bfs๊ฐ ๋๋๊ณ sort ํด์ ์ถ๋ ฅํ๋ค. answer๊ฐ ๋น์ด ์์ผ๋ฉด -1์ ์ถ๋ ฅํ๋ค.
๋ฌธ์ ํด๊ฒฐ ๊ณผ์
ํ๋ฒํ bfs ๋ฌธ์ , ์๋๋ ๋ฐ์ดํฌ์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ ์ฐ์ต ๋ฌธ์ ์๋ ๊ฒ ๊ฐ์ง๋ง, ์ ์์ง๋ ๋ชปํ๋๋ฐ ๋ด๊ฐ ์๋ ๊ฑธ๋ก ํ์ด์ผ์ง ์ด์ฉ๊ฒ ๋๊ฐ?
๋ฐ์ดํฌ์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ์ผ๋จ ๊ธฐ์ตํด ๋์๋ค๊ฐ ๋์ค์ ๋ฐ๋ก ๊ณต๋ถ๋ฅผ ํด๋ณผ๊น?
๋์ด๋ ์์ฒด๋ ๋ฌด๋ํ๋ค. bfs๋ก ํ ์ ์๋ค๋ ๊ฒ์ด ์ข์๋ค.
'๐ฏ | ๋ฐฑ์ค > ๐ | Silver' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Kotlin, S5] ๋ฐฑ์ค 32344๋ฒ ์ ๋ฌผ ๋ฐ๊ตด (0) | 2024.09.23 |
---|---|
[Kotlin, S4] ๋ฐฑ์ค 9242๋ฒ ํญํ ํด์ฒด (0) | 2024.09.20 |
[Kotlin, S5] ๋ฐฑ์ค 2828๋ฒ ์ฌ๊ณผ ๋ด๊ธฐ ๊ฒ์ (0) | 2024.09.06 |
[Kotlin, S3] ๋ฐฑ์ค 8911๋ฒ ๊ฑฐ๋ถ์ด (0) | 2024.08.30 |
[Kotlin, S4] ๋ฐฑ์ค 1337๋ฒ ์ฌ๋ฐ๋ฅธ ๋ฐฐ์ด (0) | 2024.08.29 |