ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

๐Ÿ‘ฉ๐Ÿป‍๐Ÿ’ป ๋ฌธ์ œ

 

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
๋Œ“๊ธ€