[Algorithm] ๋ฑ์ฐ์ฝ์ค ์ ํ๊ธฐ
๐ ๋ฌธ์
XX์ฐ์ n๊ฐ์ ์ง์ ์ผ๋ก ์ด๋ฃจ์ด์ ธ ์์ต๋๋ค. ๊ฐ ์ง์ ์ 1๋ถํฐ n๊น์ง ๋ฒํธ๊ฐ ๋ถ์ด์์ผ๋ฉฐ, ์ถ์
๊ตฌ, ์ผํฐ, ํน์ ์ฐ๋ด์ฐ๋ฆฌ์
๋๋ค. ๊ฐ ์ง์ ์ ์๋ฐฉํฅ ํตํ์ด ๊ฐ๋ฅํ ๋ฑ์ฐ๋ก๋ก ์ฐ๊ฒฐ๋์ด ์์ผ๋ฉฐ, ์๋ก ๋ค๋ฅธ ์ง์ ์ ์ด๋ํ ๋ ์ด ๋ฑ์ฐ๋ก๋ฅผ ์ด์ฉํด์ผ ํฉ๋๋ค. ์ด๋, ๋ฑ์ฐ๋ก๋ณ๋ก ์ด๋ํ๋๋ฐ ์ผ์ ์๊ฐ์ด ์์๋ฉ๋๋ค.
๋ฑ์ฐ์ฝ์ค๋ ๋ฐฉ๋ฌธํ ์ง์ ๋ฒํธ๋ค์ ์์๋๋ก ๋์ดํ์ฌ ํํํ ์ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด 1-2-3-2-1 ์ผ๋ก ํํํ๋ ๋ฑ์ฐ์ฝ์ค๋ 1๋ฒ์ง์ ์์ ์ถ๋ฐํ์ฌ 2๋ฒ, 3๋ฒ, 2๋ฒ, 1๋ฒ ์ง์ ์ ์์๋๋ก ๋ฐฉ๋ฌธํ๋ค๋ ๋ป์
๋๋ค.
๋ฑ์ฐ์ฝ์ค๋ฅผ ๋ฐ๋ผ ์ด๋ํ๋ ์ค ์ผํฐ ํน์ ์ฐ๋ด์ฐ๋ฆฌ๋ฅผ ๋ฐฉ๋ฌธํ ๋๋ง๋ค ํด์์ ์ทจํ ์ ์์ผ๋ฉฐ, ํด์ ์์ด ์ด๋ํด์ผ ํ๋ ์๊ฐ ์ค ๊ฐ์ฅ ๊ธด ์๊ฐ์ ํด๋น ๋ฑ์ฐ์ฝ์ค์ intensity๋ผ๊ณ ๋ถ๋ฅด๊ธฐ๋ก ํฉ๋๋ค.
๋น์ ์ XX์ฐ์ ์ถ์
๊ตฌ ์ค ํ ๊ณณ์์ ์ถ๋ฐํ์ฌ ์ฐ๋ด์ฐ๋ฆฌ ์ค ํ ๊ณณ๋ง ๋ฐฉ๋ฌธํ ๋ค ๋ค์ ์๋์ ์ถ์
๊ตฌ๋ก ๋์์ค๋ ๋ฑ์ฐ์ฝ์ค๋ฅผ ์ ํ๋ ค๊ณ ํฉ๋๋ค. ๋ค์ ๋งํด, ๋ฑ์ฐ์ฝ์ค์์ ์ถ์
๊ตฌ๋ ์ฒ์๊ณผ ๋์ ํ ๋ฒ์ฉ, ์ฐ๋ด์ฐ๋ฆฌ๋ ํ ๋ฒ๋ง ํฌํจ๋์ด์ผ ํฉ๋๋ค.
๋น์ ์ ์ด๋ฌํ ๊ท์น์ ์งํค๋ฉด์ intensity๊ฐ ์ต์๊ฐ ๋๋๋ก ๋ฑ์ฐ์ฝ์ค๋ฅผ ์ ํ๋ ค๊ณ ํฉ๋๋ค.
๋ค์์ XX์ฐ์ ์ง์ ๊ณผ ๋ฑ์ฐ๋ก๋ฅผ ๊ทธ๋ฆผ์ผ๋ก ํํํ ์์์
๋๋ค.
- ์ ๊ทธ๋ฆผ์์ ์์ ์ ํ ์ซ์๋ ์ง์ ์ ๋ฒํธ๋ฅผ ๋ํ๋ด๋ฉฐ, 1, 3๋ฒ ์ง์ ์ ์ถ์ ๊ตฌ, 5๋ฒ ์ง์ ์ ์ฐ๋ด์ฐ๋ฆฌ๊ฐ ์์ต๋๋ค. ๊ฐ ์ ๋ถ์ ๋ฑ์ฐ๋ก๋ฅผ ๋ํ๋ด๋ฉฐ, ๊ฐ ์ ๋ถ์ ์ ํ ์๋ ์ด๋ ์๊ฐ์ ๋ํ๋ ๋๋ค. ์๋ฅผ ๋ค์ด 1๋ฒ ์ง์ ์์ 2๋ฒ ์ง์ ์ผ๋ก ์ด๋ํ ๋๋ 3์๊ฐ์ด ์์๋ฉ๋๋ค.
์์ ์์์์ 1-2-5-4-3 ๊ณผ ๊ฐ์ ๋ฑ์ฐ์ฝ์ค๋ ์ฒ์ ์ถ๋ฐํ ์๋์ ์ถ์
๊ตฌ๋ก ๋์์ค์ง ์๊ธฐ ๋๋ฌธ์ ์๋ชป๋ ๋ฑ์ฐ์ฝ์ค์
๋๋ค. ๋ํ 1-2-5-6-4-3-2-1 ๊ณผ ๊ฐ์ ๋ฑ์ฐ์ฝ์ค๋ ์ฝ์ค์ ์ฒ์๊ณผ ๋ ์ธ์ 3๋ฒ ์ถ์
๊ตฌ๋ฅผ ๋ฐฉ๋ฌธํ๊ธฐ ๋๋ฌธ์ ์๋ชป๋ ๋ฑ์ฐ์ฝ์ค์
๋๋ค.
๋ฑ์ฐ์ฝ์ค๋ฅผ 3-2-5-4-3 ๊ณผ ๊ฐ์ด ์ ํ์ ๋์ ์ด๋๊ฒฝ๋ก๋ฅผ ๊ทธ๋ฆผ์ผ๋ก ๋ํ๋ด๋ฉด ์๋์ ๊ฐ์ต๋๋ค.
์ด๋, ํด์ ์์ด ์ด๋ํด์ผ ํ๋ ์๊ฐ ์ค ๊ฐ์ฅ ๊ธด ์๊ฐ์ 5์๊ฐ์
๋๋ค. ๋ฐ๋ผ์ ์ด ๋ฑ์ฐ์ฝ์ค์ intensity๋ 5์
๋๋ค.
๋ฑ์ฐ์ฝ์ค๋ฅผ 1-2-4-5-6-4-2-1 ๊ณผ ๊ฐ์ด ์ ํ์ ๋์ ์ด๋๊ฒฝ๋ก๋ฅผ ๊ทธ๋ฆผ์ผ๋ก ๋ํ๋ด๋ฉด ์๋์ ๊ฐ์ต๋๋ค.
์ด๋, ํด์ ์์ด ์ด๋ํด์ผ ํ๋ ์๊ฐ ์ค ๊ฐ์ฅ ๊ธด ์๊ฐ์ 3์๊ฐ์
๋๋ค. ๋ฐ๋ผ์ ์ด ๋ฑ์ฐ์ฝ์ค์ intensity๋ 3์ด๋ฉฐ, ์ด ๋ณด๋ค intensity๊ฐ ๋ฎ์ ๋ฑ์ฐ์ฝ์ค๋ ์์ต๋๋ค.
XX์ฐ์ ์ง์ ์ n, ๊ฐ ๋ฑ์ฐ๋ก์ ์ ๋ณด๋ฅผ ๋ด์ 2์ฐจ์ ์ ์ ๋ฐฐ์ด paths, ์ถ์
๊ตฌ๋ค์ ๋ฒํธ๊ฐ ๋ด๊ธด ์ ์ ๋ฐฐ์ด gates, ์ฐ๋ด์ฐ๋ฆฌ๋ค์ ๋ฒํธ๊ฐ ๋ด๊ธด ์ ์ ๋ฐฐ์ด summits๊ฐ ๋งค๊ฐ๋ณ์๋ก ์ฃผ์ด์ง๋๋ค. ์ด๋, intensity๊ฐ ์ต์๊ฐ ๋๋ ๋ฑ์ฐ์ฝ์ค์ ํฌํจ๋ ์ฐ๋ด์ฐ๋ฆฌ ๋ฒํธ์ intensity์ ์ต์๊ฐ์ ์ฐจ๋ก๋๋ก ์ ์ ๋ฐฐ์ด์ ๋ด์ return ํ๋๋ก solution ํจ์๋ฅผ ์์ฑํด์ฃผ์ธ์. intensity๊ฐ ์ต์๊ฐ ๋๋ ๋ฑ์ฐ์ฝ์ค๊ฐ ์ฌ๋ฌ ๊ฐ๋ผ๋ฉด ๊ทธ์ค ์ฐ๋ด์ฐ๋ฆฌ์ ๋ฒํธ๊ฐ ๊ฐ์ฅ ๋ฎ์ ๋ฑ์ฐ์ฝ์ค๋ฅผ ์ ํํฉ๋๋ค.
์ ํ์ฌํญ
- 2 ≤ n ≤ 50,000
- n - 1 ≤ paths์ ๊ธธ์ด ≤ 200,000
- paths์ ์์๋ [i, j, w] ํํ์
๋๋ค.
- i๋ฒ ์ง์ ๊ณผ j๋ฒ ์ง์ ์ ์ฐ๊ฒฐํ๋ ๋ฑ์ฐ๋ก๊ฐ ์๋ค๋ ๋ป์ ๋๋ค.
- w๋ ๋ ์ง์ ์ฌ์ด๋ฅผ ์ด๋ํ๋ ๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ ๋๋ค.
- 1 ≤ i < j ≤ n
- 1 ≤ w ≤ 10,000,000
- ์๋ก ๋ค๋ฅธ ๋ ์ง์ ์ ์ง์ ์ฐ๊ฒฐํ๋ ๋ฑ์ฐ๋ก๋ ์ต๋ 1๊ฐ์ ๋๋ค.
- 1 ≤ gates์ ๊ธธ์ด ≤ n
- 1 ≤ gates์ ์์ ≤ n
- gates์ ์์๋ ํด๋น ์ง์ ์ด ์ถ์ ๊ตฌ์์ ๋ํ๋ ๋๋ค.
- 1 ≤ summits์ ๊ธธ์ด ≤ n
- 1 ≤ summits์ ์์ ≤ n
- summits์ ์์๋ ํด๋น ์ง์ ์ด ์ฐ๋ด์ฐ๋ฆฌ์์ ๋ํ๋ ๋๋ค.
- ์ถ์ ๊ตฌ์ด๋ฉด์ ๋์์ ์ฐ๋ด์ฐ๋ฆฌ์ธ ์ง์ ์ ์์ต๋๋ค.
- gates์ summits์ ๋ฑ์ฅํ์ง ์์ ์ง์ ์ ๋ชจ๋ ์ผํฐ์ ๋๋ค.
- ์์์ ๋ ์ง์ ์ฌ์ด์ ์ด๋ ๊ฐ๋ฅํ ๊ฒฝ๋ก๊ฐ ํญ์ ์กด์ฌํฉ๋๋ค.
- return ํ๋ ๋ฐฐ์ด์ [์ฐ๋ด์ฐ๋ฆฌ์ ๋ฒํธ, intensity์ ์ต์๊ฐ] ์์์ฌ์ผ ํฉ๋๋ค.
์ ์ถ๋ ฅ ์
6 | [[1, 2, 3], [2, 3, 5], [2, 4, 2], [2, 5, 4], [3, 4, 4], [4, 5, 3], [4, 6, 1], [5, 6, 1]] | [1, 3] | [5] | [5, 3] |
7 | [[1, 4, 4], [1, 6, 1], [1, 7, 3], [2, 5, 2], [3, 7, 4], [5, 6, 6]] | [1] | [2, 3, 4] | [3, 4] |
7 | [[1, 2, 5], [1, 4, 1], [2, 3, 1], [2, 6, 7], [4, 5, 1], [5, 6, 1], [6, 7, 1]] | [3, 7] | [1, 5] | [5, 1] |
5 | [[1, 3, 10], [1, 4, 20], [2, 3, 4], [2, 4, 6], [3, 5, 20], [4, 5, 6]] | [1, 2] | [5] | [5, 6] |
โ๏ธ ํ์ด
1. ํ๋ฆฐ ํ์ด(ํ๋ก์ด๋์์ฌ - ์๊ฐ์ด๊ณผ)
์ฒ์์ ๋ฌธ์ ๋ฅผ ๋ณด๊ณ ์ด๋ป๊ฒ ํ์ง ์ ๋ชจ๋ฅด๊ฒ ์ด์ ํ๋ก์ด๋์์ฌ์ ๋๋ฆฌ๊ธฐ๋ก ํ๋ค.
์ฐ์ ์ต๋ ๊ฐ์ค์น(์์์๊ฐ)๋ฅผ ์๋ฏธํ๋ weight๋ผ๋ ์ด์ฐจ์๋ฐฐ์ด์ ์ ์ธํ๋ค. ์ด๋ ์ต์๊ฐ์ ๊ตฌํ์ง๋ง ๊ฐ๋ ๊ธธ๋ชฉ์ ์ต๋ ์์์๊ฐ์ ๊ตฌํ๊ธฐ ๋๋ฌธ์ ๊ฐ ์์๋ 0์ผ๋ก ์ด๊ธฐํํ๋ค.
์ผ์คfor๋ฌธ์ ์ด์ฉํด์ ํ๋ก์ด๋์์ฌ์ ๋๋ ธ๋๋ฐ ๋ง์ฝ ๊ธฐ์ค์ด ๋๋ ์ง์ ์ด ์ฐ๋ด์ค๋ฆฌ๋ผ๋ฉด ๊ณ์ฐํ์ง ์์์ผ ํ๊ธฐ ๋๋ฌธ์ (์ฐ๋ด์ค๋ฆฌ๋ฅผ ๊ฑฐ์ณ ๋ค๋ฅธ ์ฐ๋ด์ค๋ฆฌ๋ก ์ด๋ํ๋ ๊ฒฝ๋ก ๋ฐ์) summitsCheck๋ผ๋ ์ฐ๋ด์ค๋ฆฌ๋ฅผ ๋ด๊ณ ์๋ Set ๋ณ์๋ฅผ ๋ง๋ค์ด์คฌ๋ค.
i์์ j๋ก ์ด๋ํ ๋์ ์์ ์๊ฐ๊ณผ i์์ k, k์์ j๋ก ์ด๋ํ ๋(k๋ฅผ ๊ฑฐ์ณ๊ฐ ๋) ๊ฑธ๋ฆฌ๋ ์ต๋ ์์์๊ฐ์ ๋น๊ตํ๊ณ ์ด์ ์ ๋ง๋ค์ด๋ weight ๋ฐฐ์ด์ ๊ฐฑ์ ํด์ค๋ค.
์ถ์ ๊ตฌ์ ์ฐ๋ด์ค๋ฆฌ๋ฅผ ๋ฐ๋ณต๋ฌธ์ผ๋ก ๋๋ฉด์ ๊ฐ ์ ์์ ๋(weight[์ถ์ ๊ตฌ][์ฐ๋ด์ค๋ฆฌ]๊ฐ 0์ผ ๋)๋ฅผ ์ ์ธํ๊ณ ๊ฐ ์ ์์ ๋ answer๋ฅผ ์ต์ ํํด์คฌ๋ค.
์ด๋ ๊ฒ ๋ฌธ์ ๋ฅผ ํ์ด๋ณด๋ ์๊ฐ์ด๊ณผ๊ฐ ๋ฐ์ํ๊ณ ํด๊ฒฐํ ์ ์์๋ค. ๋ฐ๋ผ์ ๋ค๋ฅธ ํ์ด ๋ฐฉ๋ฒ์ ๊ณ ๋ฏผํ๋ค.
1. ์ ๋ต ํ์ด(BFS)
์ถ์ ๊ตฌ๋ฅผ ๊ธฐ์ค์ผ๋ก DFS ๋๋ BFS๋ฅผ ๋๋ฆฌ๋ ๊ฑด ์ด๋จ๊น๋ผ๋ ์๊ฐ์ ํ๊ฒ ๋์๊ณ ๋จผ์ DFS๋ฅผ ๋๋ ธ๋ค.
์ด๋ check๋ผ๋ n+1 ๊ธธ์ด์ ๋ฐฐ์ด์ ๋ง๋ค์ด์คฌ๋๋ฐ ์ด๋ ๊ฐ๊ฐ์ ์ถ์ ๊ตฌ์์ ์ถ๋ฐํด์ ํด๋น ์ง์ ๊น์ง ๊ฐ ๋์ ์ฃ์ง ์ค ์ต๋ ์์์๊ฐ์ ์๋ฏธํ๊ณ ์ต์๊ฐ์ ์ ์ฅํด์ผ ํ๊ธฐ ๋๋ฌธ์ Infinity๋ก ์ด๊ธฐํ์์ผฐ๋ค.
๋จผ์ ๊ทธ๋ํํ ์์ผ์ฃผ๊ณ DFS๋ฅผ ๋๋ฉด์ ์ฐ๋ด์ค๋ฆฌ๋ฅผ ๋ง๋๋ฉด ๋ ์ด์ ์งํํ์ง ์์์ผ ํ๊ธฐ ๋๋ฌธ์ ์ ํ์ด์ ๋์ผํ๊ฒ summitsCheck๋ผ๋ ์ฐ๋ด์ค๋ฆฌ๋ฅผ ๊ฐ์ง Set์ ๋ง๋ค์ด์คฌ๋ค.
ํ์ฌ ์ง์ ์์ ๊ฐ ์ ์๋ ์ง์ ์ ๋ฐ๋ณต๋ฌธ์ผ๋ก ๋๋๋ฐ ์ด๋ ํด๋น ์ง์ ๊น์ง ๊ฐ ๋์ ์ต๋ ์๊ฐ์ด check์ ์ ์ฅ๋(์ด์ ์ ๋ฐฉ๋ฌธํด์ ๊ฐฑ์ ํ ์๊ฐ)๋ณด๋ค ํฐ ๊ฒฝ์ฐ์๋ ๋์ด์ ์งํํ์ง ์๋๋ก ํ๋ค. ๋ํ ์ด๋ค ์ง์ ์์ ๋ค์ ์ง์ ์ผ๋ก ๊ฐ ๋ ์์์๊ฐ๋ณด๋ค check์ ์ ์ฅ๋ ์๊ฐ์ด ์ ๋ค๋ฉด ๋ง์ฐฌ๊ฐ์ง๋ก ๋ ์ด์ ์งํํ์ง ์๋๋ค. ์ด ๋ ์ํฉ์ ํด๋นํ์ง ์๋๋ค๋ฉด check๋ฅผ ๋ ์์ ๊ฐ์ผ๋ก ๊ฐฑ์ ํ ์ ์๋ ์ํฉ์ด๋ฏ๋ก check๋ฅผ ๊ฐฑ์ ํ๋ค. ๊ฐฑ์ ์ดํ์ ํด๋น ์ง์ ์ด ๋ง์ฝ ์ฐ๋ด์ค๋ฆฌ๋ผ๋ฉด ๋ ์ด์ ์งํํ์ง ์๋๋ค.
DFS๋ฅผ ๋๋ ธ์ ๋๋ ๋ ๊ฐ์ ํ ์คํธ์ผ์ด์ค์์ ์๊ฐ์ด๊ณผ๊ฐ ๋ฐ์ํ๋ค. graph๋ฅผ ๊ฐ์ฒด๊ฐ ์๋ Map์๋ฃ๊ตฌ์กฐ๋ก ์ ์ธํด๋ณด์์ง๋ง ๋ง์ฐฌ๊ฐ์ง์๊ณ ๊ณ ๋ฏผ์ ๋น ์ก๋ค. ๋ฐฐ์ด์ ์ด์ฉํ DFS, BFS์์ DFS๋ pop()์ ์ฌ์ฉํ๊ณ BFS๋ shift()๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ DFS๋ฅผ ๋๋ ธ๋ ๊ฒ์ธ๋ฐ ์ถ์ ๊ตฌ๋ถํฐ ์์ํด์ ์ฐ๋ด์ค๋ฆฌ๋ก ๋ค๊ฐ๊ฐ ๋ DFS๋ฅผ ๋ ๋ ๊ณ์ ๊ฐฑ์ ํ ์ ์๋ ์ํฉ์ด ๋ฐ์ํ ์ ์๋ค๊ณ ์๊ฐํ๋ค.
DFS์ ๊ฒฝ์ฐ ์ถ์ ๊ตฌ1๋ถํฐ ์์ํ์ ๋ ๋ชจ๋ ์ง์ ์ ๋๋ฉด์ ์ต๋ ์์์๊ฐ์ 2๋ก ๊ฐฑ์ ํ๋ค. ํ์ง๋ง ๋ค์ ์ถ์ ๊ตฌ2๋ฅผ ๋๋ฉด ๋ชจ๋ 1๋ก ์ด๊ธฐํํด์ผํ๋ค. ํ์ง๋ง BFS๋ฅผ ๋๋ ธ์ ๋ ์ ์ผ ์ฒ์ ์ถ์ ๊ตฌ๋ค๊ณผ ์ฐ๊ฒฐ๋ ์ง์ ์์๋ง ์ค๋ณต์ด ๋ฐ์ํ๊ณ ๋ค๋จธ์ง๋ ํ๋ฒ๋ง ์ํ๋ ๊ฒ์ด๋ค. ๋ฐ๋ผ์ BFS๋ก ๋ณ๊ฒฝํ๊ณ ๊ฒฐ๊ณผ์ ์ผ๋ก ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์๋ค.
โจ๏ธ ์๊ฐ์ด๊ณผ ์ฝ๋
function solution(n, paths, gates, summits) {
var answer = [0, Infinity];
const weight = [...Array(n + 1)].map(_ => new Array(n + 1).fill(0));
for (const path of paths) {
const [n1, n2, w] = path;
weight[n1][n2] = w;
weight[n2][n1] = w;
}
const summitsCheck = new Set();
for (const summit of summits) summitsCheck.add(summit);
for (let k = 1; k < n + 1; k++) {
if (summitsCheck.has(k)) continue;
for (let i = 1; i < n + 1; i++) {
for (let j = 1; j < n + 1; j++) {
if (!weight[i][k] || !weight[k][j]) continue;
const min = Math.max(weight[i][k], weight[k][j]);
if (weight[i][j]) {
if (weight[i][j] > min) weight[i][j] = min;
} else weight[i][j] = min;
}
}
}
summits.sort((a, b) => a - b);
for (const gate of gates) {
for (const summit of summits) {
if (!weight[gate][summit]) continue;
if (weight[gate][summit] < answer[1]) {
answer[0] = summit;
answer[1] = weight[gate][summit];
}
}
}
return answer;
}
โจ๏ธ ์ ๋ต ์ฝ๋
function solution(n, paths, gates, summits) {
var answer = [0, Infinity];
const graph = {};
for (const path of paths) {
const [n1, n2, w] = path;
if (graph[n1]) graph[n1].push([n2, w]);
else graph[n1] = [[n2, w]];
if (graph[n2]) graph[n2].push([n1, w]);
else graph[n2] = [[n1, w]];
}
const summitsCheck = new Set();
for (const summit of summits) summitsCheck.add(summit);
const queue = gates.map(gate => [gate, 0]);
const check = new Array(n + 1).fill(Infinity);
while (queue.length) {
const [node, min] = queue.shift();
for (const [next, w] of graph[node]) {
if (check[next] <= w) continue;
if (check[next] <= min) continue;
check[next] = Math.max(w, min);
if (summitsCheck.has(next)) continue;
queue.push([next, check[next]]);
}
}
summits.sort((a, b) => a - b);
for (const summit of summits) {
if (answer[1] > check[summit]) {
answer = [summit, check[summit]];
}
}
return answer;
}