๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Algorithm/๋ฐฑ์ค€

[๋ฐฑ์ค€] #14502 ์—ฐ๊ตฌ์†Œ (Python)

1. ๋ฌธ์ œ ์„ค๋ช…

๋ฌธ์ œ ๋งํฌ

  • ์ž…๋ ฅ
    • ์ฒซ์งธ ์ค„์— ์ง€๋„์˜ ์„ธ๋กœ ํฌ๊ธฐ N๊ณผ ๊ฐ€๋กœ ํฌ๊ธฐ M์ด ์ฃผ์–ด์ง„๋‹ค. (3 โ‰ค N, M โ‰ค 8)
    • ๋‘˜์งธ ์ค„๋ถ€ํ„ฐ N๊ฐœ์˜ ์ค„์— ์ง€๋„์˜ ๋ชจ์–‘์ด ์ฃผ์–ด์ง„๋‹ค. 0์€ ๋นˆ ์นธ, 1์€ ๋ฒฝ, 2๋Š” ๋ฐ”์ด๋Ÿฌ์Šค๊ฐ€ ์žˆ๋Š” ์œ„์น˜์ด๋‹ค. 2์˜ ๊ฐœ์ˆ˜๋Š” 2๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™๊ณ , 10๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ž์—ฐ์ˆ˜์ด๋‹ค.๋นˆ ์นธ์˜ ๊ฐœ์ˆ˜๋Š” 3๊ฐœ ์ด์ƒ์ด๋‹ค.
  • ์ถœ๋ ฅ : ์ฒซ์งธ ์ค„์— ์–ป์„ ์ˆ˜ ์žˆ๋Š” ์•ˆ์ „ ์˜์—ญ์˜ ์ตœ๋Œ€ ํฌ๊ธฐ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

2. ์ฝ”๋“œ

solution1.py

# -*- coding: utf-8 -*-

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())))

# 4๊ฐ€์ง€ ์ด๋™ ๋ฐฉํ–ฅ์— ๋Œ€ํ•œ ๋ฆฌ์ŠคํŠธ
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 dfs(count):
    global result
    # 2. ์šธํƒ€๋ฆฌ๊ฐ€ 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)
        # 3. ์•ˆ์ „ ์˜์—ญ์˜ ์ตœ๋Œ€๊ฐ’ ๊ณ„์‚ฐ
        result = max(result, get_score())
        return
    # 1. ๋นˆ ๊ณต๊ฐ„์— ์šธํƒ€๋ฆฌ๋ฅผ ์„ค์น˜
    for i in range(n):
        for j in range(m):
            if data[i][j] == 0:
                data[i][j] = 1
                count += 1
                dfs(count)
                data[i][j] = 0
                count -= 1

dfs(0)
print(result)

3. ํšŒ๊ณ 

  • ์•„์ง ์ด ๋ฌธ์ œ๋ฅผ ํ˜ผ์ž์„œ ํ’€๊ธฐ์—๋Š” ์–ด๋ ค์›Œ์„œ ์ด์ฝ”ํ…Œ ์ฑ… ํ’€์ด๋ฅผ ๋ณด๊ณ  ์ตœ๋Œ€ํ•œ ์ดํ•ดํ•œ ํ›„ ์™ธ์›Œ๋ฒ„๋ ธ๋‹ค.
  • ์ „์ฒด์ ์ธ ์ฝ”๋“œ์˜ ํ’€์ด ๋ฐฉํ–ฅ์€ ์„ธ ๊ฐ€์ง€๋กœ ์š”์•ฝํ•  ์ˆ˜ ์žˆ๋‹ค.
  1. ๋นˆ๊ณต๊ฐ„์— ์šธํƒ€๋ฆฌ ์„ค์น˜
  • for ๋ฌธ์œผ๋กœ data(์ดˆ๊ธฐ ๋งต ๋ฆฌ์ŠคํŠธ)๋ฅผ ๋Œ๋ฉด์„œ 0์ด ๋‚˜์˜ค๋Š” ์ˆœ๊ฐ„ 1๋กœ ๋Œ€์ฒดํ•œ๋‹ค.
  • 0์ธ ๋ชจ๋“  ๋ถ€๋ถ„ ์ค‘ ์„ธ ๊ณณ๋ฅผ ์„ ํƒํ•ด์„œ 1์„ ๋„ฃ์„ ๋•Œ, ๋‚˜์˜ฌ ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ์กฐํ•ฉ์„ ํƒ์ƒ‰ํ•ด์•ผํ•œ๋‹ค.(์™„์ „ํƒ์ƒ‰!)
  • ๊ทธ๋ž˜์„œ count ๋ณ€์ˆ˜๋ฅผ dfs๋ฅผ ์žฌ๊ท€ํ˜ธ์ถœ ํ•  ๋•Œ, ๋„ฃ์–ด์ฃผ์–ด count==3์ด ๋  ๋•Œ ๊ณผ์ •2๋ฅผ ์ˆ˜ํ–‰ํ•˜๋„๋ก ํ•œ๋‹ค.
  • dfs()๋ฅผ ๋งˆ์นœ ํ›„์— ์›์ƒ๋ณต๊ท€ํ•˜๋Š” ์ด์œ ๋Š” data์™€ count์˜ ์ดˆ๊ธฐ ์ƒํƒœ๋ฅผ ๊ณ„์† ํ™œ์šฉํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
  1. ์šธํƒ€๋ฆฌ๊ฐ€ 3๊ฐœ ์„ค์น˜๋œ ๊ฒฝ์šฐ ๋ฐ”์ด๋Ÿฌ์Šค ์ „ํŒŒ: ์ƒํ•˜์ขŒ์šฐ
  • ์šธํƒ€๋ฆฌ ์„ธ ๊ฐœ๊ฐ€ ์„ค์น˜๋œ ์‹œ์ ์— ์กฐ๊ฑด๋ฌธ์„ ๋„ฃ์–ด์„œ temp์— ์šธํƒ€๋ฆฌ๋ฅผ ๋„ฃ์€ ์ƒํƒœ(์„ธ ๊ฐœ์˜ 1์„ ๋„ฃ์€ ์ƒํƒœ)์˜ data๋ฅผ ๋ณต๋ถ™(?)ํ•ด์ค€๋‹ค.
  • ์ดˆ๊ธฐ์ƒํƒœ๋ฅผ ๊ณ„์† ์จ์„œ ๋‹ค๋ฅธ ์กฐํ•ฉ์„ ๋งค๋ฒˆ ์ฐพ์•„์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋”ฐ๋กœ ํ•ด์ค€ ๊ฒƒ ๊ฐ™๋‹ค.
  • temp๋กœ ์ •๋ณด๋ฅผ ๋ชจ๋‘ ์˜ฎ๊ธด ๋’ค์—๋Š” ๋ฐ”์ด๋Ÿฌ์Šค์˜ ์œ„์น˜(2๊ฐ€ ์žˆ๋Š” ์œ„์น˜)์—์„œ ๊ทผ์ฒ˜์— 0์ด ์žˆ์„ ๋•Œ, ์ „ํŒŒ๋ฅผ ์ง„ํ–‰ํ•ด์•ผํ•œ๋‹ค. ์ด๊ฑด virusํ•จ์ˆ˜์—์„œ ์ˆ˜ํ–‰๋œ๋‹ค.
  • virus() ํ•จ์ˆ˜์—๋Š” temp์—์„œ 2๊ฐ€ ๋ฐœ๊ฒฌ๋œ ์ˆœ๊ฐ„์˜ x,y ์ขŒํ‘œ๋ฅผ ์ „๋‹ฌํ•ด์ค€๋‹ค.
  • ํ•ด๋‹น ์ขŒํ‘œ๋ฅผ ์ƒํ•˜์ขŒ์šฐ๋ฅผ ํƒ์ƒ‰ํ•˜์—ฌ 0์„ ๋ฐœ๊ฒฌํ•˜๋ฉด 2๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ์ž‘์—…์„ ์žฌ๊ท€์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•œ๋‹ค.
  1. ์•ˆ์ „ ์˜์—ญ์˜ ์ตœ๋Œ€๊ฐ’ ๊ณ„์‚ฐ: 0์˜ ๊ฐœ์ˆ˜
  • ์ „ํŒŒ๊ฐ€ ๊ฐ€๋Šฅํ•œ ๊ณณ์„ ๋ชจ๋‘ 2๋กœ ๋งŒ๋“  ํ›„์—๋Š” ๋‚จ์•„์žˆ๋Š” 0์˜ ๊ฐœ์ˆ˜๋ฅผ ์„ธ์„œ ์•ˆ์ „์˜์—ญ์„ ๊ณ„์‚ฐํ•ด์•ผํ•œ๋‹ค.
  • getscore()๋Š” ํ˜„์žฌ temp์˜ ์ƒํƒœ๋ฅผ ๊ธฐ์ค€์œผ๋กœ 0์˜ ๊ฐœ์ˆ˜๋ฅผ ์„ธ์„œ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • ๋ฐ˜ํ™˜๋œ ๊ฒฐ๊ณผ๋Š” ๋‹ค๋ฅธ ์กฐํ•ฉ์—์„œ์˜ score๊ฐ€ ์ €์žฅ๋˜์–ด ์žˆ์„ result์™€ ๋น„๊ตํ•˜์—ฌ ์ตœ๋Œ€๊ฐ’์„ result์— ์ €์žฅํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.
  • ๊ทธ๋ž˜์•ผ ๋ชจ๋“  ๊ฒฝ์šฐ๋ฅผ ํƒ์ƒ‰ํ•˜์—ฌ ์•ˆ์ „ ์˜์—ญ์˜ ์ตœ๋Œ€ ํฌ๊ธฐ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค.
  • return์„ ํ•ด์ค€ ์ด์œ ๋Š” ์šธํƒ€๋ฆฌ๋ฅผ ์„ธ ๊ฐœ ์„ค์น˜ํ–ˆ์„ ๋•Œ๊นŒ์ง€๋งŒ if๋ฌธ์„ ์‹คํ–‰ํ•˜๊ณ , ๊ทธ ์ด์ƒ์˜ ๊ฒฝ์šฐ๋Š” ํƒ์ƒ‰ํ•˜์ง€ ์•Š๊ธฐ ์œ„ํ•ด์„œ์ด๋‹ค.

4. ์ฐธ๊ณ 

https://github.com/ndb796/python-for-coding-test/blob/master/13/2.py