๐ง๐ป [Python] ๋ฐฑ์ค 1915 ๊ฐ์ฅ ํฐ ์ ์ฌ๊ฐํ
Gold 2 - Backtracking
ํ๋ ฌ์ ์ํํ๋ฉด์, 1์ ์ฐพ๊ฒ๋๋ฉด, ๊ทธ 1์ ๋ํ ๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ๊ฐ์ง๊ณ ์ต์๊ฐ์ ๊ตฌํ๋ ๊ฒ์ด๋ค
- ์) ์ฐพ์ 1์ ๊ธฐ์ค์ผ๋ก 1X1 ์์ข ์ด๋ฅผ ๋ฎ์ ๊ฒฝ์ฐ
- ์) ์ฐพ์ 1์ ๊ธฐ์ค์ผ๋ก 2X2 ์์ข ์ด๋ฅผ ๋ฎ์ ๊ฒฝ์ฐ
- ์) ์ฐพ์ 1์ ๊ธฐ์ค์ผ๋ก 3X3 ์์ข ์ด๋ฅผ ๋ฎ์ ๊ฒฝ์ฐ
- ์) ์ฐพ์ 1์ ๊ธฐ์ค์ผ๋ก 4X4 ์์ข ์ด๋ฅผ ๋ฎ์ ๊ฒฝ์ฐ
- ์) ์ฐพ์ 1์ ๊ธฐ์ค์ผ๋ก 5X5 ์์ข ์ด๋ฅผ ๋ฎ์ ๊ฒฝ์ฐ
56๋ฒ์งธ ์ค์ด ๋๋๋ฉด, ๋๋ถ๋ถ์ 1์ 0์ผ๋ก ๋ฐ๊ปด์ ธ ์์ ๊ฒ์ด๋ค (๋ง์ฝ ํ ์ฌ์ด์ฆ์ ์์ข ์ด๋ฅผ 5์ฅ์ ๋๊ธฐ๋ฉด, 1๋ก ์ ์ง๊ฐ ๋ ๊ฒ์ด๋ค)
์ฝ๋
matrix = [list(map(int, input().split())) for _ in range(10)]
count = [0] * 6
ans = 25
def is_possible(i, j, size):
if count[size] == 5:
return False
if i + size > 10 or j + size > 10:
return False
for r in range(size):
for c in range(size):
if matrix[i + r][j + c] == 0:
return False
return True
def mark(i, j, size, fill):
for r in range(size):
for c in range(size):
matrix[i + r][j + c] = fill
if fill == 0:
count[size] += 1
else:
count[size] -= 1
def backtrack(i, j):
global ans
if i == 10:
ans = min(ans, sum(count))
return
if j == 10:
backtrack(i + 1, 0)
return
if matrix[i][j] == 0:
backtrack(i, j + 1)
return
for size in range(1, 6):
if is_possible(i, j, size):
mark(i, j, size, 0)
backtrack(i, j + 1)
mark(i, j, size, 1)
backtrack(0, 0)
print(-1 if ans == 25 else ans)
'์๊ณ ๋ฆฌ์ฆ > DFS BFS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Python] ๋ฐฑ์ค 15650 N๊ณผ M 2 (0) | 2023.04.02 |
---|---|
[Python] ๋ฐฑ์ค 15649 N๊ณผ M (0) | 2023.04.02 |
[Python] ๋ฐฑ์ค 1389 ์ผ๋น ๋ฒ ์ด์ปจ์ 6๋จ๊ณ ๋ฒ์น (0) | 2023.03.29 |
[Python] ๋ฐฑ์ค 1967 ํธ๋ฆฌ์ ์ง๋ฆ (0) | 2023.02.16 |
[Python] ๋ฐฑ์ค 1520 ๋ด๋ฆฌ๋ง๊ธธ (0) | 2023.02.15 |