๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ’ป Programming/์•Œ๊ณ ๋ฆฌ์ฆ˜ ํ…Œ์ŠคํŠธ

[python] ๋ฐฑ์ค€14502_์—ฐ๊ตฌ์†Œ (DFS&BFS)

by ๋ญ…์ฆค 2022. 2. 6.
๋ฐ˜์‘ํ˜•

๋ฌธ์ œ

 

ํ’€์ด

DFS๋กœ ๋ฐ”์ด๋Ÿฌ์Šค ํผ์ง€๊ฒŒ ํ•˜๋Š” ํ•จ์ˆ˜์™€ ํ˜„์žฌ ๋งต์—์„œ ์•ˆ์ „์˜์—ญ์„ ๊ตฌํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด ๋‘๊ณ ,

๋นˆ ๊ณต๊ฐ„์— ์šธํƒ€๋ฆฌ๋ฅผ ์น˜๋Š” ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ DFS๋กœ ์ฐพ์œผ๋ฉด์„œ ๋งค๋ฒˆ ์•ˆ์ „์˜์—ญ์˜ ํฌ๊ธฐ๋ฅผ ๊ฒ€์‚ฌํ•œ๋‹ค.

 

 

์ฝ”๋“œ

n, m = map(int,input().split())

data = [] # ์ดˆ๊ธฐ ๋งต ๋ฆฌ์ŠคํŠธ
temp = [[0]*m for _ in range(n)]

for _ in range(n):
    data.append(list(map(int,input().split())))

# ์„œ๋‚จ๋™๋ถ
dx = [-1,0,1,0]
dy = [0,1,0,-1]

result = 0

# DFS๋กœ ๋ฐ”์ด๋Ÿฌ์Šค ํผ์ง€๊ฒŒ ํ•˜๊ธฐ
def virus(x,y):
    for i in range(4):
        nx = x + dx[i]
        ny = y + dy[i]
        # ์ƒํ•˜์ขŒ์šฐ ์ค‘์—์„œ ๋ฐ”์ด๋Ÿฌ์Šค๊ฐ€ ํผ์งˆ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ
        if nx >= 0 and nx < n and ny >=0 and ny < m :
            if temp[nx][ny] == 0:
                # ํ•ด๋‹น ์œ„์น˜์— ๋ฐ”์ด๋Ÿฌ์Šค ๋ฐฐ์น˜ํ•˜๊ณ , ์žฌ๊ท€์ ์œผ๋กœ ์ˆ˜ํ–‰
                temp[nx][ny] = 2
                virus(nx,ny)

# ํ˜„์žฌ ๋งต์—์„œ ์•ˆ์ „ ์˜์—ญ์˜ ํฌ๊ธฐ ๊ณ„์‚ฐ
def get_score():
    score = 0
    for i in range(n):
        for j in range(m):
            if temp[i][j] == 0:
                score += 1
    return score

# DFS๋ฅผ ์ด์šฉํ•˜์—ฌ ์šธํƒ€๋ฆฌ๋ฅผ ์„ค์น˜ํ•˜๋ฉด์„œ, ๋งค๋ฒˆ ์•ˆ์ „ ์˜์—ญ์˜ ํฌ๊ธฐ ๊ณ„์‚ฐ
def main_dfs(count):
    global result
    # ์šธํƒ€๋ฆฌ๊ฐ€ 3๊ฐœ ์„ค์น˜๋œ ๊ฒฝ์šฐ
    if count ==3:
        for i in range(n):
            for j in range(m):
                temp[i][j] = data[i][j]

        # ๊ฐ ๋ฐ”์ด๋Ÿฌ์Šค์˜ ์œ„์น˜์—์„œ ์ „ํŒŒ ์ง„ํ–‰
        for i in range(n):
            for j in range(m):
                if temp[i][j] == 2:
                    virus(i,j)
        
        # ์•ˆ์ „ ์˜์—ญ์˜ ์ตœ๋Œ€๊ฐ’ ๊ณ„์‚ฐ
        result = max(result, get_score())
        return

    # ๋นˆ ๊ณต๊ฐ„์— ์šธํƒ€๋ฆฌ ์„ค์น˜ -> ์šธํƒ€๋ฆฌ ์„ค์น˜๋Š” ๋นˆ๊ณต๊ฐ„์ด n๊ฐœ ์ผ๋•Œ, nC3 ๊ฐœ์˜ ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๋ชจ๋‘ ๊ฒ€ํ† ํ•ด์•ผํ•จ / 0์ธ ์ขŒํ‘œ๋ฅผ ๋ชจ๋‘ ๊ตฌํ•˜๊ณ  ๋ชจ๋“  combination์„ ๊ตฌํ•ด์„œ ํ•ด๋„ ๋ ๋“ฏ
    # i,j ์ˆœํšŒํ•˜๋ฉด์„œ ์ฒซ ๋ฒฝ์„ธ์šฐ๊ณ , dfs ํƒ€๊ณ  i,j ์ˆœํšŒํ•˜๋ฉด์„œ 2๋ฒˆ์งธ ๋ฒฝ ์„ธ์šฐ๊ณ  ๋‹ค์‹œ dfsํƒ€๊ณ 
    # 3๋ฒˆ ์งธ ๋ฒฝ ์„ธ์šฐ๊ณ  get_score() ์•ˆ์ „ ์ง€์—ญ ๊ณ„์‚ฐํ•˜๊ณ , ์žฌ๊ท€ ํ’€๋ฆฌ๋ฉด์„œ 3๋ฒˆ์งธ ๋ฒฝ ์ง€์šฐ๊ณ  ๋‹ค์Œ ์œ„์น˜์—
    # 3๋ฒˆ ์งธ ๋ฒฝ ๋‹ค์‹œ ์„ธ์šฐ๊ณ ... ๊ณ„์† ๋ฐ˜๋ณตํ•˜๋ฉด ๋ฒฝ์„ ์„ธ์šธ ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜ ๋‹ค ํ™•์ธ
    for i in range(n):
        for j in range(m):
            if data[i][j] == 0:		# ๋นˆ ๊ณต๊ฐ„ ์ผ ๋•Œ
                data[i][j] = 1		# ๋ฒฝ ์„ธ์šฐ๊ณ 
                count += 1			# ๋ฒฝ ์„ธ์šธ ๋•Œ ๋งˆ๋‹ค count +=1
                main_dfs(count)		# ๋‹ค์Œ ๋ฒฝ ์„ธ์šฐ๊ธฐ ์œ„ํ•ด dfs
                data[i][j] = 0		# ์žฌ๊ท€ ํ’€๋ฆฌ๋Š” ๊ณผ์ • ์„ธ์› ๋˜ ๋ฒฝ ์ง€์šฐ๊ณ 
                count -= 1			# ์นด์šดํŠธ๋„ ๋ณต๊ท€

main_dfs(0)

print(result)

 

๋ฐ˜์‘ํ˜•