๊ฐ์ฒ ๋ถ๋์ ๊ฐ ๋ถ๋์์ด ์ฌ๋ฌ ์ง์ญ์ ๋ฟ๋ฟ์ด ํฉ์ด์ ธ ํน์ ์๋ฌด๋ฅผ ์ํ ์ค์ ๋๋ค. ์ง๋์์ ๊ฐ์ฒ ๋ถ๋๊ฐ ์์นํ ์ง์ญ์ ํฌํจํ ๊ฐ ์ง์ญ์ ์ ์ผํ ๋ฒํธ๋ก ๊ตฌ๋ถ๋๋ฉฐ, ๋ ์ง์ญ ๊ฐ์ ๊ธธ์ ํต๊ณผํ๋ ๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ ๋ชจ๋ 1๋ก ๋์ผํฉ๋๋ค. ์๋ฌด๋ฅผ ์ํํ ๊ฐ ๋ถ๋์์ ์ง๋ ์ ๋ณด๋ฅผ ์ด์ฉํ์ฌ ์ต๋จ์๊ฐ์ ๋ถ๋๋ก ๋ณต๊ทํ๊ณ ์ ํฉ๋๋ค. ๋ค๋ง ์ ๊ตฐ์ ๋ฐฉํด๋ก ์ธํด, ์๋ฌด์ ์์ ๋์ ๋ค๋ฅด๊ฒ ๋๋์์ค๋ ๊ฒฝ๋ก๊ฐ ์์ด์ ธ ๋ณต๊ท๊ฐ ๋ถ๊ฐ๋ฅํ ๋ถ๋์๋ ์์ ์ ์์ต๋๋ค.
๊ฐ์ฒ ๋ถ๋๊ฐ ์์นํ ์ง์ญ์ ํฌํจํ ์ด์ง์ญ์ ์ n
, ๋ ์ง์ญ์ ์๋ณตํ ์ ์๋ ๊ธธ ์ ๋ณด๋ฅผ ๋ด์ 2์ฐจ์ ์ ์ ๋ฐฐ์ด roads
, ๊ฐ ๋ถ๋์์ด ์์นํ ์๋ก ๋ค๋ฅธ ์ง์ญ๋ค์ ๋ํ๋ด๋ ์ ์ ๋ฐฐ์ด sources
, ๊ฐ์ฒ ๋ถ๋์ ์ง์ญ destination
์ด ์ฃผ์ด์ก์ ๋, ์ฃผ์ด์ง sources
์ ์์ ์์๋๋ก ๊ฐ์ฒ ๋ถ๋๋ก ๋ณต๊ทํ ์ ์๋ ์ต๋จ์๊ฐ์ ๋ด์ ๋ฐฐ์ด์ returnํ๋ solution ํจ์๋ฅผ ์์ฑํด์ฃผ์ธ์. ๋ณต๊ท๊ฐ ๋ถ๊ฐ๋ฅํ ๊ฒฝ์ฐ ํด๋น ๋ถ๋์์ ์ต๋จ์๊ฐ์ -1์
๋๋ค.
n
โค 100,000n
๊น์ง์ ๋ฒํธ๋ก ๊ตฌ๋ถ๋ฉ๋๋ค.roads
์ ๊ธธ์ด โค 500,000roads
์ ์์์ ๊ธธ์ด = 2roads
์ ์์๋ [a, b] ํํ๋ก ๋ ์ง์ญ a, b๊ฐ ์๋ก ์๋ณตํ ์ ์์์ ์๋ฏธํฉ๋๋ค.(1 โค a, b โค n, a โ b)sources
์ ๊ธธ์ด โค 500sources[i]
โค ndestination
โค nn | roads | sources | destination | result |
---|---|---|---|---|
3 | [[1, 2], [2, 3]] | [2, 3] | 1 | [1, 2] |
5 | [[1, 2], [1, 4], [2, 4], [2, 5], [4, 5]] | [1, 3, 5] | 5 | [2, -1, 0] |
์ ์ถ๋ ฅ ์ #1
์ ์ถ๋ ฅ ์ #2
function solution(n, roads, sources, destination) {
// ๋ฐฉ๋ฌธ ๊ธฐ๋ก์ ํ์ธํ ๋ฐฐ์ด ์์ฑ
const visited = new Array(n+1).fill(Infinity)
// ์ฐ๊ฒฐ๋ ๊ธธ ์์ฑ
const connect = new Array(n+1).fill(0).map(_ => [])
roads.forEach(([from, to]) => {
connect[from].push(to)
connect[to].push(from)
})
// BFS ์๊ณ ๋ฆฌ์ฆ
// ๋ชฉ์ ์ง๋ก ๋ถํฐ ๋ถ๋์์ ์์น๊น์ง์ ๊ฑฐ๋ฆฌ๋ฅผ ํ์
const q = [destination]
visited[destination] = 0
while(q.length) {
const cur = q.shift()
// ๊ฐ ์ ์๋ ๋ค์ ๊ธธ
for(const next of connect[cur]) {
// ๊ฐ๋ณด์ง ์์ ๊ธธ์ด๋ผ๋ฉด, ๊ทธ๋ ๊ธฐ์ ์ด๊ธฐ์ ๋ชจ๋ ๊ฐ์ Infinity๋ก ์ค์
if(visited[cur]+1 < visited[next]) {
visited[next] = visited[cur]+1
q.push(next)
}
}
}
return sources.map(a => visited[a] !== Infinity ? visited[a] : -1)
}
ํด๋น ํ์ด๋ my-first-programming๋์ ํ์ด๋ฅผ ์ฐธ๊ณ ํ์ฌ ์ ์๋์์์ ๋ฐํ๋๋ค.