์ผ๋น ๋ฒ ์ด์ปจ์ 6๋จ๊ณ ๋ฒ์น(1389๋ฒ)
Silver 1
#๊ทธ๋ํ ์ด๋ก #๊ทธ๋ํ ํ์ #๋๋น ์ฐ์ ํ์ #์ต๋จ ๊ฒฝ๋ก #ํ๋ก์ด๋–์์
๋ฌธ์ ๋ด์ฉ
๋ฌธ์ ์ ๊ทผ
๊ฐ ์ฌ์ฉ์๊ฐ ์ด๋ค ์ฌ์ฉ์์ ๊ด๊ณ๋ฅผ ๋งบ๊ณ ์๋์ง ํ์ธํด์ ๊ทธ๋ํ๋ฅผ ๋๋ฉด์ ๋ช ๋ฒ์งธ ๋จ๊ณ์์ ์ํ๋ ์ฌ์ฉ์์๊ฒ ๋ฟ์ ์ ์๋์ง ํ์ธํด์ผ ํ๋ค.
์ ๋ ฅ ์์ 1์ ์ด์ฉํด ๊ทธ๋ํ๋ฅผ ๋จผ์ ๊ตฌ์ฑํด ์ฃผ๊ฒ ๋ค. ๊ทธ๋ํ์ ๊ตฌ์ฑ์ ๋ค์๊ณผ ๊ฐ์ด ํด์ค ์ ์๋ค.
import java.io.BufferedReader
import java.io.InputStreamReader
import java.util.*
import kotlin.math.min
private var graph = arrayOf<MutableList<Int>>()
private var visited = booleanArrayOf()
private var result = 0
fun main() = with(BufferedReader(InputStreamReader(System.`in`))) {
val (user, relationships) = readLine().split(" ").map { it.toInt() }
graph = Array(user + 1) { mutableListOf() }
visited = BooleanArray(user + 1)
for (i in 0 until relationships) {
val relationship = readLine().split(" ").map { it.toInt() }
graph[relationship[0]].add(relationship[1])
graph[relationship[1]].add(relationship[0])
}
var currentMin = Int.MAX_VALUE
var answer = 0
for (i in user downTo 1) {
var totalRes = 0
visited.fill(false)
result = 0
for (f in 1 .. user) {
visited.fill(false)
result = 0
if (i == f) continue
find(i, f)
totalRes += result
}
val newMin = min(currentMin, totalRes)
// ๋ ์ ์ ์ผ๋น ๋ฒ ์ด์ปจ ์๋ฅผ ๊ตฌํ๊ธฐ.
if (newMin < currentMin) {
currentMin = newMin
answer = i
}
// ํ์ฌ i์ ์ผ๋น ๋ฒ ์ด์ปจ ์์ ํฉ๊ณผ ํ์ ์ผ๋น ๋ฒ ์ด์ปจ ์์ ์ต์๊ฐ๊ณผ ๊ฐ๋ค๋ฉด i๋ฅผ ๊ฐฑ์ ํด์ฃผ๊ธฐ.
else if (totalRes == currentMin) {
answer = i
}
}
println(answer)
}
private fun find(user: Int, toFind: Int) {
val queue: Queue<List<Int>> = LinkedList()
visited[user] = true
for (u in graph[user]) {
if (u == toFind) {
result = 1
return
}
queue.add(listOf(u, 1))
}
while (queue.isNotEmpty()) {
val data = queue.poll()
val checkUser = data[0]
val level = data[1]
for (g in graph[checkUser]) {
if (!visited[g]) {
if (g == toFind) {
result += level + 1
return
}
queue.add(listOf(g, level + 1))
visited[g] = true
}
}
}
}
์์ ์ ๋ ฅ 1์์ ๋ ๋ฒ์งธ ์ค์ ์ ๋ ฅ์ด 1 3์ธ๋ฐ, ๊ทธ๋์ 1์ ํด๋นํ๋ ์์น์๋ 3์ ๋ฃ๊ณ , 3์ ํด๋นํ๋ ์์น์๋ 1์ ๋ฃ์ด์ ์๋ก ๊ด๊ณ๋ฅผ ๋งบ์ด ์ค๋ค. ์ด๋ฅผ ๋ชจ๋ ์ ๋ ฅ๊ฐ์ ๊ด๊ณ๋ฅผ ์ถ๊ฐํด ์ฃผ๋ฉด ๊ทธ๋ํ๊ฐ ๋ค์๊ณผ ๊ฐ์ด ์์ฑ๋ ๊ฒ์ด๋ค.
์ด์ ์ ๊ทธ๋ํ์์ ์ ์ 5๊ฐ ์ ์ 2๊น์ง ์ด๋ํ๋ ค๋ฉด 5 -> 4 -> 3 -> 2๋ก ์ด 3๋ฒ์ ์ด๋์ด ์์ด์ผ ํ๊ธฐ ๋๋ฌธ์ ์ ๋ต์ 3์ด ๋๋ค.
์ด์ ์ฝ๋๋ฅผ ํ์ฉํด ์กฐ๊ฑด์ ํ์ํด ๋ณด์.์ผ๋น ๋ฒ ์ด์ปจ์ ์๊ฐ ๊ฐ์ฅ ์ ์ ์๋ฅผ ๊ตฌํด์ผ ํ๊ธฐ ๋๋ฌธ์ min() ํจ์๋ฅผ ์ฌ์ฉํ ์ ์๋ค.๋ํ ์ผ๋น ๋ฒ ์ด์ปจ ์๊ฐ ๊ฐ์ ๊ฒฝ์ฐ๋ ์กด์ฌํ ์ ์๋ค. ์์ ์ ๋ ฅ 1์ ๊ฒฝ์ฐ์๋ ์ต์๊ฐ 3, 4๋ก ์ผ๋น ๋ฒ ์ด์ปจ ์๋ 5๋ก ๋๊ฐ๋ค.์ด ๊ฒฝ์ฐ์๋ ๋ ๋ฒํธ๊ฐ ์์ ์ฌ๋์ ๋ฒํธ๋ฅผ ์ถ๋ ฅํ๋ค.์ด ๋ฌธ์ ์ ๋ต์ ๊ตฌํ๊ธฐ ์ํด์๋ ๊ธฐ์ค์ด ๋๋ ์ฌ๋๊ณผ ์ฐพ์์ผ ํ๋ ์ฌ๋ ์ด 2๊ฐ์ง๊ฐ ํ์ํ๋ค. ์ฐพ์์ผ ํ๋ ์ฌ๋์ ๊ธฐ์ค์ด ๋๋ ์ฌ๋๊ณผ ๊ฐ์ผ๋ฉด ์ ๋๋ค.2์ค ๋ฐ๋ณต๋ฌธ์ ์ฌ์ฉํด์ ๊ธฐ์ค์ด ๋๋ ์ฌ๋๊ณผ ์ฐพ์์ผ ํ๋ ์ฌ๋์ ๊ตฌํ ์ ์๋ค.๋ ๊ฐ์ด ๊ฐ์ ๊ฒฝ์ฐ์๋ continue๋ก ๋๊ธฐ๋ฉด ๋๋ค.๋ํ ๋ฐ๋ณต ์์๋ฅผ ํฐ ์์์ ์์ ์๋ก ๊ฐ๋๋ก ๋ฐ๋ณตํด์ผ ํ๋ค. ๊ทธ๋์ผ ์์ ์ธ๊ธํ๋ ์ผ๋น ๋ฒ ์ด์ปจ ์๊ฐ ๊ฐ์ ์ฌ๋์ด ์ฌ๋ฌ ๋ช ์ผ ๋ ๋ฒํธ๊ฐ ์์ ์ฌ๋์ ๊ตฌํ๊ธฐ ์ฝ๋ค.bfs๋ฅผ ์ด์ฉํด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ค.
์์ธํ bfs ๋ก์ง์ ๋ฌธ์ ํ์ด์์ ์ ์ด ๋ณด๊ฒ ๋ค.
๋ฌธ์ ํด๊ฒฐ ์ฝ๋
import java.io.BufferedReader
import java.io.InputStreamReader
import java.util.*
import kotlin.math.min
private var graph = arrayOf<MutableList<Int>>()
private var visited = booleanArrayOf()
private var result = 0
fun main() = with(BufferedReader(InputStreamReader(System.`in`))) {
val (user, relationships) = readLine().split(" ").map { it.toInt() }
graph = Array(user + 1) { mutableListOf() }
visited = BooleanArray(user + 1)
for (i in 0 until relationships) {
val relationship = readLine().split(" ").map { it.toInt() }
graph[relationship[0]].add(relationship[1])
graph[relationship[1]].add(relationship[0])
}
var currentMin = Int.MAX_VALUE
var answer = 0
for (i in user downTo 1) {
var totalRes = 0
visited.fill(false)
result = 0
for (f in 1 .. user) {
visited.fill(false)
result = 0
if (i == f) continue
find(i, f)
totalRes += result
}
val newMin = min(currentMin, totalRes)
// ๋ ์ ์ ์ผ๋น ๋ฒ ์ด์ปจ ์๋ฅผ ๊ตฌํ๊ธฐ.
if (newMin < currentMin) {
currentMin = newMin
answer = i
}
// ํ์ฌ i์ ์ผ๋น ๋ฒ ์ด์ปจ ์์ ํฉ๊ณผ ํ์ ์ผ๋น ๋ฒ ์ด์ปจ ์์ ์ต์๊ฐ๊ณผ ๊ฐ๋ค๋ฉด i๋ฅผ ๊ฐฑ์ ํด์ฃผ๊ธฐ.
else if (totalRes == currentMin) {
answer = i
}
}
println(answer)
}
private fun find(user: Int, toFind: Int) {
val queue: Queue<List<Int>> = LinkedList()
visited[user] = true
for (u in graph[user]) {
if (u == toFind) {
result = 1
return
}
queue.add(listOf(u, 1))
}
while (queue.isNotEmpty()) {
val data = queue.poll()
val checkUser = data[0]
val level = data[1]
for (g in graph[checkUser]) {
if (!visited[g]) {
if (g == toFind) {
result += level + 1
return
}
queue.add(listOf(g, level + 1))
visited[g] = true
}
}
}
}
๋ฌธ์ ํ์ด
graph(2์ฐจ์ List)์ ์ ๋ ฅ๊ฐ์ ๋ฃ๋๋ค.
2์ฐจ์ ๋ฆฌ์คํธ์ ์ฒซ ๋ฒ์งธ index๊ฐ์ user์ ๋ฒํธ๋ฅผ ๋ปํ๊ณ , ์ฒซ ๋ฒ์งธ index ์์ ๋ฆฌ์คํธ๋ user์ ๊ด๊ณ๋ฅผ ๋งบ๊ณ ์๋ ๋ค๋ฅธ user๋ค์ด๋ค.
graph์ ๊ตฌ์กฐ๋ ์ฌ์ง 1-2์ ๊ฐ์ ๊ฒ์ด๋ค.
visited๋ 1์ฐจ์ ๋ฆฌ์คํธ๋ก ์ค์ ํด ์ค๋ค. ๊ด๊ณ ๊ทธ๋ํ๋ฅผ ๋๋ฉด์ ๋ช ๋ฒ์งธ user๋ฅผ ๊ฑฐ์ณค๋์ง ํ์ธํด ์ฃผ๋ ์์ ์ด๊ธฐ ๋๋ฌธ์ 2์ฐจ์ ๋ฆฌ์คํธ ํ์ ์ผ๋ก ์ ์ํ ํ์๊ฐ ์๋ค. ์๋ฅผ ๋ค์ด ์ฌ์ง 1-2์ 4๋ฒ์งธ ๊ฐ์ 1, 5, 3์ด ๋ค์ด๊ฐ ๋ฆฌ์คํธ์ธ๋ฐ, ์ฌ๊ธฐ์์ 3์ด ์ด๋ฏธ ๋ฐฉ๋ฌธํ ์ฌ์ฉ์๋ผ๋ฉด 3์ ์ ์ธํ 1, 5๋ง ๋ณด๋ฉด ๋๋ค.
์ด์ 2์ค ๋ฐ๋ณต์ ๋๋ฉด์ bfs๋ฅผ ์ํํ๋ค.
bfs์์๋ ํ์ฌ ์ฌ์ฉ์(i)์ ๋ง๋์ผ ํ๋ ์ฌ์ฉ์(f)๊ฐ ์ฃผ์ด์ง๋ค.
์ฒ์์ queue์ graph์ i๋ฒ์งธ index์ ๋์ค๋ ๋ฐ์ดํฐ๋ฅผ target์ผ๋ก ๋ฐ๋ณต๋ฌธ์ ๋๋ ค์ queue์ ๋ฃ์ด ์ค๋ค. ๋ง์ฝ ์ฒ์๋ถํฐ ์ฐพ์์ผ ํ๋ ๊ฐ์ธ f๊ฐ ์๋ค๋ฉด ๊ฒฐ๊ณผ๋ฅผ 1๋ก ์ ์ฅํ๊ณ ๊บผ๋ ๋๋ค.
queue๊ฐ ๋น์ด์์ง ์์ ๋๊น์ง ๋ฐ๋ณตํด ์ค๋ค.
๋น์ด ์์ง ์์ผ๋ฉด ๊ฐ๋ก ๊ฐ์ ๋ฃ์ด์ค๋ค. ๋ง์ฝ ์ฒ์๋ถํฐ ์ฐพ์์ผ ํ๋ ๊ฐ์ธ onFind๊ฐ ์กด์ฌํ๋ค๋ฉด result๋ฅผ 1๋ก ๋ณ๊ฒฝํ๊ณ ํจ์๋ฅผ ์ข ๋ฃํ๋ค.
์๋๋ฉด queue๊ฐ ๋น์ด์์ง ์์ ๋๊น์ง ๋ฐ๋ณตํ๋ค.
bfs๋ฅผ ๋๋ฉด์ ์ฌ์ฉ์ ๋ฒํธ๋ฅผ ํต๊ณผํ๋์ง ์๋์ ์กฐ๊ฑด์ผ๋ก ํ์ธํ๋ค.
if (!visited[g])
์ด ์กฐ๊ฑด์ด ๋ง์กฑํ๊ณ ์ฐพ์์ผ ํ๋ toFind์ ๊ฐ์ผ๋ฉด result๋ฅผ queue์์ ๋ฝ์์จ ๋ฐ์ดํฐ์ level์ + 1๋งํผ ํด์ค ๊ฐ์ผ๋ก ์ค์ ํ๋ค.
๋ง์ง๋ง์ queue์ ์ถ๊ฐํ๊ณ ๋ฐฉ๋ฌธ ์ฌ๋ถ๋ฅผ ์ฒดํฌํ๋ค.
๋ฌธ์ ํด๊ฒฐ ๊ณผ์
๊ทธ๋ํ ๊ตฌ์กฐ๋ฅผ ์ง์ bfs๋ฅผ ๋๋ฆฌ๋ ๋ฌธ์ ์ด๋ค.
์ฌ์ฉ์๋ค ๊ฐ์ ๊ด๊ณ๋ฅผ ๊ทธ๋ํ๋ก ์ ํํํด์ผ bfs๋ฅผ ์ธ ๋ ํธํ๋ค. ๊ทธ๊ฒ๋ง ์กฐ๊ธ ์๊ฐํ๋ฉด ํ๊ธฐ ์ด๋ ต์ง ์์๋ค.
'๐ฏ | ๋ฐฑ์ค > ๐ | Silver' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Kotlin, S5] ๋ฐฑ์ค 1340๋ฒ ์ฐ๋ ์งํ๋ฐ (0) | 2024.08.08 |
---|---|
[Kotlin, S1] ๋ฐฑ์ค 5525๋ฒ IOIOI (0) | 2024.08.06 |
[Kotlin, S2] ๋ฐฑ์ค 30804๋ฒ ๊ณผ์ผ ํํ๋ฃจ (0) | 2024.08.05 |
[Kotlin, S2] ๋ฐฑ์ค 21736๋ฒ ํ๋ด๊ธฐ๋ ์น๊ตฌ๊ฐ ํ์ํด (0) | 2024.08.04 |
[Kotlin, S2] ๋ฐฑ์ค 18111๋ฒ ๋ง์ธํฌ๋ํํธ (0) | 2024.08.03 |