dev/algorithm
BOJ / 4963๋ฒ / ์ฌ์ ๊ฐ์ [Go][Python3]
crscnt
2020. 12. 12. 23:00
๐ฉ๐ป๐ป ๋ฌธ์
4963๋ฒ: ์ฌ์ ๊ฐ์
์ ๋ ฅ์ ์ฌ๋ฌ ๊ฐ์ ํ ์คํธ ์ผ์ด์ค๋ก ์ด๋ฃจ์ด์ ธ ์๋ค. ๊ฐ ํ ์คํธ ์ผ์ด์ค์ ์ฒซ์งธ ์ค์๋ ์ง๋์ ๋๋น w์ ๋์ด h๊ฐ ์ฃผ์ด์ง๋ค. w์ h๋ 50๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์์ ์ ์์ด๋ค. ๋์งธ ์ค๋ถํฐ h๊ฐ ์ค์๋ ์ง๋
www.acmicpc.net
โ๐ป ํ์ด
๐จ Go
// https://www.acmicpc.net/problem/4963
package main
import (
"bufio"
"fmt"
"os"
)
var (
graph [][]int
visited [][]bool
)
func main() {
reader := bufio.NewReader(os.Stdin)
writer := bufio.NewWriter(os.Stdout)
defer writer.Flush()
for {
var w, h int
fmt.Fscanln(reader, &w, &h)
if w == 0 && h == 0 {
break
}
graph = make([][]int, h)
for i := 0; i < h; i++ {
graph[i] = make([]int, w)
}
visited = make([][]bool, h)
for i := 0; i < h; i++ {
visited[i] = make([]bool, w)
}
for i := 0; i < h; i++ {
for j := 0; j < w; j++ {
fmt.Fscanf(reader, "%d ", &graph[i][j])
}
}
var numOfIslands int
for i := 0; i < h; i++ {
for j := 0; j < w; j++ {
if !visited[i][j] && graph[i][j] == 1 { // ์ฌ์ด๋ฉด์ ๋ฐฉ๋ฌธํ์ง ์์ ๊ฒฝ์ฐ
numOfIslands++
dfs(i, j)
}
}
}
fmt.Fprintln(writer, numOfIslands)
}
}
func dfs(h, w int) {
visited[h][w] = true
var startH, startW, endH, endW = h, w, h, w
if h-1 >= 0 {
startH--
}
if h+1 < len(graph) {
endH++
}
if w-1 >= 0 {
startW--
}
if w+1 < len(graph[h]) {
endW++
}
// ์, ํ, ์ข, ์ฐ, ๋๊ฐ์ ํ์
for i := startH; i <= endH; i++ {
for j := startW; j <= endW; j++ {
if graph[i][j] == 1 && !visited[i][j] { // ์ฌ์ด๋ฉด์ ๋ฐฉ๋ฌธํ์ง ์์ ๊ฒฝ์ฐ ์ฌ๊ท
dfs(i, j)
}
}
}
}
๐จ Python3
# https://www.acmicpc.net/problem/4963
import sys
sys.setrecursionlimit(2500) # python ์ฌ๊ทํจ์ ํธ์ถ ํ์๋ 1000ํ์ด๋ฏ๋ก ์ค์ ๋ณ๊ฒฝ
graph = []
visited = []
def dfs(h, w):
global visited
global graph
visited[h][w] = True
start_h, start_w, end_h, end_w = h, w, h, w
if h-1 >= 0:
start_h -= 1
if h+1 < len(graph):
end_h += 1
if w+1 < len(graph[h]):
end_w += 1
if w-1 >= 0:
start_w -= 1
for i in range(start_h, end_h+1):
for j in range(start_w, end_w+1):
if graph[i][j] == 1 and not visited[i][j]:
dfs(i, j)
if __name__ == "__main__":
while True:
w, h = list(map(int, sys.stdin.readline().split()))
if w == 0 and h == 0:
break
graph = []
visited = [[False for i in range(w)] for j in range(h)]
for i in range(h):
graph.append(list(map(int, sys.stdin.readline().split())))
num_of_islands = 0
for i in range(h):
for j in range(w):
if not visited[i][j] and graph[i][j] == 1:
num_of_islands += 1
dfs(i, j)
print(num_of_islands)
728x90