๋ฌธ์ ์ค๋ช
์ฌ๋๋ฐฉ์ฌ์ฒญ์์๋ ๋ง์ ๋น๊ฐ ๋ด๋ฆฌ๋ ์ฅ๋ง์ฒ ์ ๋๋นํด์ ๋ค์๊ณผ ๊ฐ์ ์ผ์ ๊ณํํ๊ณ ์๋ค. ๋จผ์ ์ด๋ค ์ง์ญ์ ๋์ด ์ ๋ณด๋ฅผ ํ์ ํ๋ค. ๊ทธ ๋ค์์ ๊ทธ ์ง์ญ์ ๋ง์ ๋น๊ฐ ๋ด๋ ธ์ ๋ ๋ฌผ์ ์ ๊ธฐ์ง ์๋ ์์ ํ ์์ญ์ด ์ต๋๋ก ๋ช ๊ฐ๊ฐ ๋ง๋ค์ด ์ง๋ ์ง๋ฅผ ์กฐ์ฌํ๋ ค๊ณ ํ๋ค. ์ด๋, ๋ฌธ์ ๋ฅผ ๊ฐ๋จํ๊ฒ ํ๊ธฐ ์ํ์ฌ, ์ฅ๋ง์ฒ ์ ๋ด๋ฆฌ๋ ๋น์ ์์ ๋ฐ๋ผ ์ผ์ ํ ๋์ด ์ดํ์ ๋ชจ๋ ์ง์ ์ ๋ฌผ์ ์ ๊ธด๋ค๊ณ ๊ฐ์ ํ๋ค.
์ด๋ค ์ง์ญ์ ๋์ด ์ ๋ณด๋ ํ๊ณผ ์ด์ ํฌ๊ธฐ๊ฐ ๊ฐ๊ฐ N์ธ 2์ฐจ์ ๋ฐฐ์ด ํํ๋ก ์ฃผ์ด์ง๋ฉฐ ๋ฐฐ์ด์ ๊ฐ ์์๋ ํด๋น ์ง์ ์ ๋์ด๋ฅผ ํ์ํ๋ ์์ฐ์์ด๋ค. ์๋ฅผ ๋ค์ด, ๋ค์์ N=5์ธ ์ง์ญ์ ๋์ด ์ ๋ณด์ด๋ค.
์ด์ ์์ ๊ฐ์ ์ง์ญ์ ๋ง์ ๋น๊ฐ ๋ด๋ ค์ ๋์ด๊ฐ 4 ์ดํ์ธ ๋ชจ๋ ์ง์ ์ด ๋ฌผ์ ์ ๊ฒผ๋ค๊ณ ํ์. ์ด ๊ฒฝ์ฐ์ ๋ฌผ์ ์ ๊ธฐ๋ ์ง์ ์ ํ์์ผ๋ก ํ์ํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
๋ฌผ์ ์ ๊ธฐ์ง ์๋ ์์ ํ ์์ญ์ด๋ผ ํจ์ ๋ฌผ์ ์ ๊ธฐ์ง ์๋ ์ง์ ๋ค์ด ์, ์๋, ์ค๋ฅธ์ชฝ ํน์ ์ผ์ชฝ์ผ๋ก ์ธ์ ํด ์์ผ๋ฉฐ ๊ทธ ํฌ๊ธฐ๊ฐ ์ต๋์ธ ์์ญ์ ๋งํ๋ค. ์์ ๊ฒฝ์ฐ์์ ๋ฌผ์ ์ ๊ธฐ์ง ์๋ ์์ ํ ์์ญ์ 5๊ฐ๊ฐ ๋๋ค(๊ผญ์ง์ ์ผ๋ก๋ง ๋ถ์ด ์๋ ๋ ์ง์ ์ ์ธ์ ํ์ง ์๋๋ค๊ณ ์ทจ๊ธํ๋ค).
๋ํ ์์ ๊ฐ์ ์ง์ญ์์ ๋์ด๊ฐ 6์ดํ์ธ ์ง์ ์ ๋ชจ๋ ์ ๊ธฐ๊ฒ ๋ง๋๋ ๋ง์ ๋น๊ฐ ๋ด๋ฆฌ๋ฉด ๋ฌผ์ ์ ๊ธฐ์ง ์๋ ์์ ํ ์์ญ์ ์๋ ๊ทธ๋ฆผ์์์ ๊ฐ์ด ๋ค ๊ฐ๊ฐ ๋จ์ ํ์ธํ ์ ์๋ค.
์ ๊ฐ์ด ์ฅ๋ง์ฒ ์ ๋ด๋ฆฌ๋ ๋น์ ์์ ๋ฐ๋ผ์ ๋ฌผ์ ์ ๊ธฐ์ง ์๋ ์์ ํ ์์ญ์ ๊ฐ์๋ ๋ค๋ฅด๊ฒ ๋๋ค. ์์ ์์ ๊ฐ์ ์ง์ญ์์ ๋ด๋ฆฌ๋ ๋น์ ์์ ๋ฐ๋ฅธ ๋ชจ๋ ๊ฒฝ์ฐ๋ฅผ ๋ค ์กฐ์ฌํด ๋ณด๋ฉด ๋ฌผ์ ์ ๊ธฐ์ง ์๋ ์์ ํ ์์ญ์ ๊ฐ์ ์ค์์ ์ต๋์ธ ๊ฒฝ์ฐ๋ 5์์ ์ ์ ์๋ค.
์ด๋ค ์ง์ญ์ ๋์ด ์ ๋ณด๊ฐ ์ฃผ์ด์ก์ ๋, ์ฅ๋ง์ฒ ์ ๋ฌผ์ ์ ๊ธฐ์ง ์๋ ์์ ํ ์์ญ์ ์ต๋ ๊ฐ์๋ฅผ ๊ณ์ฐํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ ๋ ฅ
์ ๊ฐ์ด ์ฅ๋ง์ฒ ์ ๋ด๋ฆฌ๋ ๋น์ ์์ ๋ฐ๋ผ์ ๋ฌผ์ ์ ๊ธฐ์ง ์๋ ์์ ํ ์์ญ์ ๊ฐ์๋ ๋ค๋ฅด๊ฒ ๋๋ค. ์์ ์์ ๊ฐ์ ์ง์ญ์์ ๋ด๋ฆฌ๋ ๋น์ ์์ ๋ฐ๋ฅธ ๋ชจ๋ ๊ฒฝ์ฐ๋ฅผ ๋ค ์กฐ์ฌํด ๋ณด๋ฉด ๋ฌผ์ ์ ๊ธฐ์ง ์๋ ์์ ํ ์์ญ์ ๊ฐ์ ์ค์์ ์ต๋์ธ ๊ฒฝ์ฐ๋ 5์์ ์ ์ ์๋ค.
์ถ๋ ฅ
์ฒซ์งธ ์ค์ ์ฅ๋ง์ฒ ์ ๋ฌผ์ ์ ๊ธฐ์ง ์๋ ์์ ํ ์์ญ์ ์ต๋ ๊ฐ์๋ฅผ ์ถ๋ ฅํ๋ค.
์ ์ถ๋ ฅ ์์
์ ๋ ฅ
5
6 8 2 6 2
3 2 3 4 6
6 7 3 3 2
7 2 5 3 6
8 9 5 2 7
์ถ๋ ฅ
5
๋ด ๋ฌธ์ ํ์ด
let n = Int(readLine()!)!
var area = [[Int]]()
var heights = [Int]()
for _ in 0..<n {
area.append(readLine()!.split(separator: " ").map({Int(String($0))!}))
for i in 0..<n {
if !heights.contains(area[area.count-1][i]) { heights.append(area[area.count-1][i]) }
}
}
heights.sort() // heights ์ค๋ฆ์ฐจ์ ์ ๋ ฌ
var count = 0
var max = 1
let area_fix = area
// dfs ํจ์
func dfs(_ x: Int, _ y: Int, _ now_h: Int) {
if x < 0 || y < 0 || x >= n || y >= n || area[x][y] <= now_h { return } // ์์ธ
area[x][y] = now_h // ์ด๋ฏธ ์ฒดํฌํ ์๋ฆฌ๋ ํ์ฌ ๋น์ ๋์ด์ ๋์ผํ๊ฒ ๋ฐ๊ฟ์ฃผ๊ธฐ
// ์ฌ๊ท ํธ์ถ
dfs(x+1, y, now_h)
dfs(x-1, y, now_h)
dfs(x, y+1, now_h)
dfs(x, y-1, now_h)
}
// ๋ฉ์ธ ์คํ๋ฌธ
for i in heights {
let h = i // ํ์ฌ ๋ฐ๋ณต์์ ํ์ธํ ๋น์ ๋์ด
for x in 0..<n {
for y in 0..<n {
if area[x][y] > h { // ํ์ฌ ์ง์ ์ด ๋น์ ๋์ด๋ณด๋ค ๋์ ๊ฒฝ์ฐ
count += 1
dfs(x, y, h)
}
}
}
if max < count { max = count }
count = 0
area = area_fix
}
print(max)
๐ dfs ๋ฌธ์ ๋ก, ์ง์ ๋ง๋ค์ ๋์ด๋ฅผ ๋ฏธ๋ฆฌ ํ์ ํ์ฌ ๊ทธ์ ๋ง๋ ๊ฐ์๋์ ์ค์ ํ๋ ๊ฒ์ด ํฌ์ธํธ!
์ด ๋ฌธ์ ๋ ์ด์ ์ ์ค๋ฒ ๋ฌธ์ ๋ค์ ๋นํด์ ์ชผ๊ธ ๋์ด๋๊ฐ ์๋ ๊ฒ์ฒ๋ผ ๋ณด์ผ ์ ์๋๋ฐ,
[๊ฐ์๋๋ณด๋ค ๋์ ์ง์ ]๊ณผ [๊ฐ์๋๋ณด๋ค ๋ฎ๊ฑฐ๋ ๊ฐ์ ์ง์ ]์ผ๋ก ๋๋ ์ ๋ง์น 0, 1์ฒ๋ผ ์๊ฐํ๊ณ ํ๋ฉด ์ฝ๋ค.
๋งจ ์๋ถํฐ ์ฝ๋๋ฅผ ์ดํด๋ณด์.
[๋ณ์ ์ ์ธ]
- area๋ ์ง์ญ์ ๋์ด ์ ๋ณด๋ฅผ ๋ด์ ๋ฐฐ์ด๋ก ์ฌ์ฉํ๊ธฐ ์ํด ์ ์ธํ๊ณ ,
heights๋ ์ง์ ๋ค ์ค ์ด๋ค ๋์ด๋ค์ด ์๋์ง ์ค๋ณต ์์ด ์ ์ฅํ๊ธฐ ์ํด ์ ์ธํ๋ค.
(๋ฌธ์ ์์ ์ง์ ๋ค์ ๋์ด๋ 1๋ถํฐ 100๊น์ง๋ผ๊ณ ํ๊ณ , ๋ชจ๋ ์ข ๋ฅ์ ๋์ด๊ฐ ์กด์ฌํ๋ ๊ฒ์ด ์๋๋ฏ๋ก
๊ตณ์ด ๋ชจ๋ ๋น์ ๋์ด๋ค์ ํ์ํด ์ค ํ์ ์์ด ์ฃผ์ด์ง ๋์ด๋ค ๋งํผ๋ง ํ์ธํด์ฃผ๋ฉด๋๊ธฐ ๋๋ฌธ์ ์ ์ธํ์์) - 2์ค for๋ฌธ์ ํ์ฉํ์ฌ area์ ์
๋ ฅ ๊ฐ์ ๋ฃ์ด์ค๊ณผ ๋์์
contains๋ฅผ ์ฌ์ฉํด ์ค๋ณต๊ฒ์ฌ๋ฅผ ํ๋ฉด์ heights ๋ฐฐ์ด๊น์ง ํจ๊ป ์์ฑํด์ฃผ์๋ค. - ์์ฑํ heights ๋ฐฐ์ด์ ์ด์ฉํด์ ๊ฐ์๋๋ณ๋ก bfs ํ์์ ํด ์ค ์์ ์ด๋ฏ๋ก,
๊ฐ์๋ ๋ณ ์์ ์์ญ์ ๊ฐ์๋ฅผ ์ธ๊ธฐ ์ํ ๋ณ์๋ก count๋ฅผ ์์ฑํด์ฃผ์๊ณ
๊ฒฐ๊ณผ๊ฐ์ผ๋ก ์ถ๋ ฅํ ์ต๋ ์์ ์์ญ์ ๊ฐ์๋ฅผ ๋ด์ max ๋ณ์๋ ๋ง๋ค์ด์ฃผ์๋ค.
(max์๋ 1์ ์ด๊น๊ฐ์ผ๋ก ์ค์ ํ๋๋ฐ, ๋น๊ฐ ์ ํ 0๋งํผ ์ฌ ๊ฒฝ์ฐ์๋ ์์ ์์ญ์ด 1์ด๋ฏ๋ก
์๋ฌด๋ฆฌ ์์ ๊ฐ์ด๋ผ๋ ์ต๋๊ฐ์ 1 ์ด์์ด๋ค. ๋ฐ๋ผ์ ์ฒ์๋ถํฐ 1๋ก ์ด๊ธฐํํด์ฃผ์๋ค.)
๊ทธ๋ฆฌ๊ณ dfs ํจ์๋ฅผ ๋๋ฆด ๋ area ์์๋ฅผ ๋ณ๊ฒฝ์์ผ์ฃผ๋ฉด์ ํ ์์ ์ด๋ฏ๋ก
์ด๊ธฐ์ area ๊ฐ์ ๊ทธ๋๋ก ์ ์ฅํด๋๊ธฐ ์ํด area_fix ๋ฐฐ์ด์ ์์ฑํด์ฃผ์๋ค.
[dfs ํจ์]
- ํ์ฌ ์์น ๊ฐ x, y์ ํ์ฌ ๊ฐ์๋ now_h๋ฅผ ๋ฐ์์ค๋ dfs๋ฅผ ๊ตฌํํ๋ค.
- x, y๊ฐ ์ง์ญ์์ ๋ฒ์ด๋๋ ์์น ๊ฐ์ด๊ฑฐ๋ area[x][y]๊ฐ now_h๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ผ๋ฉด ์์ธ๋ก ์ฒ๋ฆฌํ๋ค.
์์์ ๋งํ๋ฏ์ด ์ฐ๋ฆฌ๋ [๊ฐ์๋๋ณด๋ค ๋์ ์ง์ ]๊ณผ [๊ฐ์๋๋ณด๋ค ๋ฎ๊ฑฐ๋ ๊ฐ์ ์ง์ ] ์ด๋ ๊ฒ
๋ ๊ฐ์ง๋ก ๋๋ ์ ๋ณผ ์์ ์ธ๋ฐ, [๊ฐ์๋๋ณด๋ค ๋ฎ๊ฑฐ๋ ๊ฐ์ ์ง์ ]์ผ ๊ฒฝ์ฐ๋ ์์ ์์ญ์ด ์๋๋ค.
๋ฐ๋ผ์ ์์ ์์ญ์ด ์๋ ๊ณณ์ ํ์์ ์ด์ด๊ฐ ํ์๊ฐ ์์ผ๋ฏ๋ก ์์ธ์ฒ๋ฆฌํด์ค์ผํ๋ค. - ๊ทธ๋ฆฌ๊ณ ์ค๋ณต์ ํผํ๊ธฐ ์ํด ์ด๋ฏธ ํ์์ค์ธ area[x][y] ์ง์ ์ now_h๋ก ๋ณ๊ฒฝํด์ฃผ์๋ค.
์์ ์์ธ ์ฒ๋ฆฌ์์ ๊ฑธ๋ฆฌ์ง ์์๋ค๋ฉด ํ ์ง์ ์ ์์ ์์ญ์ด๋ผ๋ ๋ป์ธ๋ฐ, ์ด๊ฑธ ๊ทธ๋๋ก ๋๋ฉด
์ฌ๊ท ํธ์ถ์ด ๊ณ์ ๋ฐ๋ณต๋๋ฉด์ ๊ฐ์ ๊ณณ์ ๊ณ์ ํ์ํ๊ฒ ๋ ์ ์๋ค.
๋ฐ๋ผ์ ์ด๋ฏธ ์ฒดํฌํ ์ง์ ์ ์์ ์์ญ์์ ์ ์ธ์์ผ์ ์ค๋ณต์ ํผํด์ค๊ฒ์ด๋ค. - ์, ํ, ์ข, ์ฐ ๋ค ๋ฐฉํฅ์ผ๋ก ์ง์ ์ ์ฎ๊ฒจ๊ฐ๋ฉฐ ์ฌ๊ทํธ์ถํด์ฃผ์๋ค.
- ์ด์ด์ง ์์ ์ง์ ๋ค์ด ๋ชจ๋ ์์ ํ์ง ์์ ์์ญ์ผ๋ก ๋ฐ๋๋ฉด dfs ํจ์๊ฐ ์์ ํ ์ข ๋ฃ๋๋ค.
[๋ฉ์ธ ์คํ]
- ์์์ ๋ง๋ค์๋ heights ๋ฐฐ์ด์ ๋ชจ๋ ์์๋ฅผ ๋ฐ๋ณตํ ๋๊น์ง ๋ฐ๋ณต๋ฌธ์ ์คํํ๋ค.
๋ฐ๋ณต๋ง๋ค h ์์๋ฅผ ์ ์ธํ์ฌ ๊ฐ์๋์ ๋ฌ๋ฆฌํด์ฃผ์๋ค. - 2์ค for๋ฌธ์ผ๋ก ๋ชจ๋ ์ง์ ์ ์ฒดํฌํด์ฃผ์๊ณ ,
๊ฐ์๋๋ณด๋ค ๋์ ์ง์ ์ ๋ง๋๋ฉด (์์ ์์ญ์ ๋ง๋๋ฉด) dfs ํจ์๋ฅผ ์คํํ๋ค.
ํ ๋ฒ ์์ ์์ญ์ ๋ง๋ ๋๋ง๋ค ํ๋์ ์์ ์์ญ์ ์ฐพ์ ๊ฒ์ด๋ฏ๋ก ์นด์ดํธํ๋ค. - ์์ 2์ค for๋ฌธ์์ ๊ตฌํ ์์ ์์ญ์ ๊ฐ์๊ฐ max๋ณด๋ค ํด ๊ฒฝ์ฐ max๋ฅผ ์
๋ฐ์ดํธํ๋ค.
๊ทธ๋ฆฌ๊ณ ๋ค์ ๊ฐ์๋์์์ ์์ ์์ญ ๊ฐ์๋ฅผ ๋ ๊ตฌํด์ค์ผํ๋ฏ๋ก ์นด์ดํธ๋ฅผ ์ด๊ธฐํํ๋ค.
dfs ํจ์๋ฅผ ์คํํ ๋ area ๋ฐฐ์ด์ ์์๋ค์ ๋ณ๊ฒฝํด์ฃผ๋ฉด์ ํ์ํด์ฃผ์์ผ๋ฏ๋ก,
area ๋ฐฐ์ด์ ๋ค์ ์์๋ณต๊ทํ๊ธฐ ์ํด area์ area_fix๋ฅผ ํ ๋นํด์ฃผ์๋ค.
๐ก ํผ๋๋ฐฑ
- ์ด์ ์ ํ์๋ ๋ฌธ์ ๋ค์ ๋นํด์ ์กฐ๊ธ ๋ ์๊ฐํด์ค ๋ถ๋ถ๋ค์ด ๋ง์๋ ๋ฌธ์ ์๋ค.
๊ทธ๋๋ ์กฐ๊ธ๋ง ์๊ฐํ๋ฉด ์ ํ์ ์ธ dfs๋ฌธ์ ์์ ํฌ๊ฒ ๋ฒ์ด๋์ง ์๋ ์ ํ์ด์๊ณ , ๊ธ๋ฐฉ ํ ์ ์์๋ค. - ์ข ๋ ํจ์จ์ ์ผ๋ก ํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์๋์ง ์ฐพ์๋ด์ผ๊ฒ ๋ค.
๋ฌธ์
'3๏ธโฃ Swift > Problem Solving' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Swift Algorithm] 1, 2, 3 ๋ํ๊ธฐ BOJ #9095 (0) | 2021.10.19 |
---|---|
[Swift Algorithm] 1๋ก ๋ง๋ค๊ธฐBOJ #1463 (0) | 2021.10.19 |
[Swift Algorithm] ๋์ดํธ์ ์ด๋ BOJ #7562 (0) | 2021.10.11 |
[Swift Algorithm] ๋จ์ง๋ฒํธ๋ถ์ด๊ธฐ BOJ #2667 (0) | 2021.10.10 |
[Swift Algorithm] ์์ญ ๊ตฌํ๊ธฐ BOJ #2583 (0) | 2021.10.10 |
๋๊ธ