๊ฐ์
๋ฌธ์ https://www.acmicpc.net/problem/1005
๐ ํด๋น ๋ฌธ์ ๋ ์ด์ ์ ํ์๋ ์์ ์ ๋ ฌ ๋ฌธ์ ์ธ 2252๋ฒ์ ์ด์ฉํ์๋ฉด ์ฝ๊ฒ ์ดํดํ ์ ์์ต๋๋ค.
๊ฐ์ ์๊ณ ๋ฆฌ์ฆ์ธ ์์ ์ ๋ ฌ์๋ค๊ฐ ๋ ธ๋ ๋ณ๋ก ๊ฐ์ค์น(์๊ฐ)์ ์ ๋ น์ด๋ฉด ๋ฉ๋๋ค.
์๋ ๊ทธ๋ฆผ์ผ๋ก ์ดํดํด๋ด ์๋ค.
ํ์ดํ๊ฐ ๋ฐฉํฅ, ์ ์์ ์ซ์๊ฐ ๊ทธ ๋ ธ๋์ ์๊ฐ์ ๋๋ค.
ํน์ ๋ ธ๋๊น์ง์ ์๊ฐ์ ์ดํฉ์ ์๋ ค๋ฉด ์ด์ ์ ๊ฐ๋ค์ ๋ค ๋ํ๋ฉด ๋ฉ๋๋ค.
์ด๋ฐ ์์ผ๋ก ๋์ค๋ ๋ฐ ๊ฐ ๋ ธ๋์ ํฉ์ ๊ฒฝ์ฐ
์ ์ฒด ๋ ธ๋์ ๊ฐ์๋งํผ์ ๋ฆฌ์คํธ๋ฅผ ๋ง๋ ํ ๊ฑฐ๊ธฐ์ ์ด์ ๋ ธ๋์ ๊ฐ๊ณผ ํ์ฌ ๋ ธ๋ ๊ฐ์ ์ ์ฅํ๊ฒ ๋ก์ง์ ๊ตฌ์ฑํ๋ฉด
๊ฐ๋จํ๊ฒ ํด๊ฒฐ ๋ฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ๊ทธ๋ฆผ์ฒ๋ผ 7๋ฒ ๋ ธ๋๋ ์ด์ ๊ฐ ์ค ํฐ ๊ฐ์ ๊ธฐ์ค์ผ๋ก ๊ฐ์ ธ์ค๋ฉด๋ฉ๋๋ค.
(์ด์ ๋ ธ๋๊ฐ ์ ๋ถ ์๋ฃ๋์ด์ผ ํ๋ฏ๋ก ๊ฐ์ฅ ํฐ ์๋ฅผ ๊ฐ์ ธ์ผ ํฉ๋๋ค.)
์ฝ๋
์๋ ์ฝ๋๋ฅผ ๋ณด์๋ฉด ์ด์ ์์์ ๋ ฌ ๋ฌธ์ ์์ ์กฐ๊ธ๋ง ๋ฌ๋ผ์ง ๊ฒ์ ๋๋ ์ ์์ ๊ฒ๋๋ค
๋ฌ๋ผ์ง ์ ์
- ๊ฐ ๋ ธ๋๋ณ ๊ฑด์ค ์๊ฐ์ ๋ด์ ๋ฆฌ์คํธ
- ๊ฐ ๋ ธ๋๊น์ง์ ๊ฑด์ค ์๊ฐ์ ๋ด์ ๋ฆฌ์คํธ
- ๋ชฉํ ๊ฑด๋ฌผ์ ์ง์ ์ฐจ์๊ฐ ์์ ๊ฒฝ์ฐ ์์ธ ์ฒ๋ฆฌ
- ๊ฐ ๋ ธ๋๋ณ์ ์ ๊ทผํ๋ ๊ฐ์ฅ ํฐ ์๊ฐ ๊ฐ์ ์ ์ฅ
- ๋ชฉํ ๋ ธ๋๊ฐ ๋์ค๋ฉด ์ข ๋ฃ
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
// ํ
์คํธ ์ผ์ด์ค๋งํผ ๋ฐ๋ณต
reader := bufio.NewReader(os.Stdin)
var testCases int
fmt.Fscanln(reader, &testCases)
for i := 0; i < testCases; i++ {
acmCraft(reader)
}
}
func acmCraft(reader *bufio.Reader) {
// ๊ฑด๋ฌผ ์ n, ๊ฑด๋ฌผ ์์ k, ๋ชฉํ ๊ฑด๋ฌผ ๋ฒํธ w ์
๋ ฅ
var n, k, w int
// ๊ฑด๋ฌผ ์, ์์ ์
๋ ฅ
fmt.Fscanln(reader, &n, &k)
// n+1์ ํ๋ ์ด์ ๋ ๊ณ์ฐ์ ํธ์๋ฅผ ์ํด 0 ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ์ง ์๊ธฐ ์ํจ
// ์ธ์ ๋ฆฌ์คํธ, ํฌ๊ธฐ ๋น๊ต๋ฅผ ํด์ ์์ ์(key) -> ํฐ ์(value)๋ก ๋๊ฒ ์ ์ฅํ ์์
adjList := make([][]int, n+1)
// ๊ฑด๋ฌผ ๋น ๊ฑด์ค์ ๊ฑธ๋ฆฌ๋ ์๊ฐ
buildTime := make([]int, n+1)
// ์ง์
์ฐจ์
inDegree := make([]int, n+1)
// ๊ฑธ๋ฆฌ๋ ์๊ฐ
buildTotalTime := make([]int, n+1)
// ๊ฑด๋ฌผ ๋น ๊ฑด์ค์ ๊ฑธ๋ฆฌ๋ ์๊ฐ ์
๋ ฅ
for i := 1; i <= n; i++ {
fmt.Fscan(reader, &buildTime[i])
}
fmt.Fscanln(reader)
// ๊ฑด๋ฌผ ์์ ์
๋ ฅ
for i := 0; i < k; i++ {
var prev, next int
fmt.Fscanln(reader, &prev, &next)
// ๊ฑด๋ฌผ ๋ฒํธ๋ก ์์ ์ -> ํฐ ์๋ก ์ ์ฅ
adjList[prev] = append(adjList[prev], next)
// ํฐ ์์ ์ง์
์ฐจ์ ์ฆ๊ฐ
inDegree[next]++
}
// ๋ชฉํ ๊ฑด๋ฌผ ๋ฒํธ ์
๋ ฅ
fmt.Fscanln(reader, &w)
// ์ง์
์ฐจ์๊ฐ 0์ธ ๊ฒ์ ํ์ ๋ฃ์
queue := []int{}
for i := 1; i <= n; i++ {
if inDegree[i] == 0 {
queue = append(queue, i)
buildTotalTime[i] = buildTime[i]
}
}
// ๋ชฉํ ๊ฑด๋ฌผ์ ๋ฐ๋ก ์ง์ ์ ์๋ ๊ฒฝ์ฐ ๋ฐํ
if inDegree[w] == 0 {
fmt.Println(buildTime[w])
return
}
// ํ๊ฐ ๋น๋ ๊น์ง ์ ๋ ฌ
for len(queue) > 0 {
// ํ์์ ๊ฐ์ ๊บผ๋
current := queue[0]
queue = queue[1:]
// ํ์์ ๊บผ๋ธ ๊ฐ๊ณผ ์ฐ๊ฒฐ๋ ๋
ธ๋๋ค์ ์ง์
์ฐจ์๋ฅผ 1์ฉ ๊ฐ์
for _, next := range adjList[current] {
// ๊ฐ ๋
ธ๋๋ณ๋ก ๊ฐ์ฅ ์ค๋ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ ์ ์ฅ
if buildTotalTime[next] < buildTotalTime[current]+buildTime[next] {
buildTotalTime[next] = buildTotalTime[current] + buildTime[next]
}
// ์ง์
์ฐจ์๊ฐ 0์ด ๋๋ฉด ํ์ ๋ฃ์
inDegree[next]--
if inDegree[next] == 0 {
// ๋ง์ฝ ๋ชฉํ ๊ฑด๋ฌผ์ด ์ง์
์ฐจ์๊ฐ 0์ด ๋๋ฉด ๊ทธ ๊ฑด๋ฌผ์ ๊ฑด์ค ์๊ฐ์ ์ถ๋ ฅํ๊ณ ์ข
๋ฃ
if next == w {
fmt.Println(buildTotalTime[next])
return
}
queue = append(queue, next)
}
}
}
}
'Go Lang > Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[GoLang] ๋ฐฑ์ค 1019๋ฒ, ์ฑ ํ์ด์ง (0) | 2024.02.22 |
---|---|
[GoLang] ๋ฐฑ์ค 1007๋ฒ, ๋ฒกํฐ ๋งค์นญ (1) | 2024.02.18 |
[GoLang] ๋ฐฑ์ค 1004๋ฒ, ์ด๋ฆฐ ์์(ํผํ๊ณ ๋ผ์ค ์ ๋ฆฌ) (1) | 2024.02.09 |
[GoLang] ๋ฐฑ์ค 2252๋ฒ, ์ค ์ธ์ฐ๊ธฐ(์์ ์ ๋ ฌ) (0) | 2024.02.06 |
[GoLang] ๋ฐฑ์ค 1009๋ฒ, ๋ถ์ฐ์ฒ๋ฆฌ(์ ๊ณฑ ์์ ์ผ์ ์๋ฆฌ) (0) | 2024.02.04 |