https://www.acmicpc.net/problem/17136
17136번: 색종이 붙이기
<그림 1>과 같이 정사각형 모양을 한 다섯 종류의 색종이가 있다. 색종이의 크기는 1×1, 2×2, 3×3, 4×4, 5×5로 총 다섯 종류가 있으며, 각 종류의 색종이는 5개씩 가지고 있다. <그림 1> 색종이를 크
www.acmicpc.net
'''
17136번: 색종이 붙이기 / gold 2 / 백트래킹
'''
import sys
input = sys.stdin.readline
# 그래프 입력
graph = []
for _ in range(10):
graph.append(list(map(int, input().split())))
remain = [0, 5, 5, 5, 5, 5]
result = 26
def check_cover(x, y, k):
rx, ry = x + k, y + k
if rx > 10 or ry > 10:
return False
for nx in range(x, rx):
for ny in range(y, ry):
if graph[nx][ny] != 1:
return False
return True
def change_graph(x, y, k, num):
for i in range(x, x + k):
for j in range(y, y + k):
graph[i][j] = num
def backtracking(x, y, cnt):
global result
if x == 10:
result = min(result, cnt)
return
if y == 10:
backtracking(x + 1, 0, cnt)
return
if graph[x][y] == 1:
for k in range(1, 6):
if remain[k] == 0:
continue
if check_cover(x, y, k) == True:
remain[k] -= 1
change_graph(x, y, k, 0)
backtracking(x, y + 1, cnt + 1)
remain[k] += 1
change_graph(x, y, k, 1)
else:
backtracking(x, y + 1, cnt)
backtracking(0, 0, 0)
if result == 26:
print(-1)
else:
print(result)
코드 리뷰
- 해당 문제를 90분 안에 풀지 못해서 구글링을 해서 문제 해결 방법을 알게 된 후 정답 판정을 받았습니다.
구글링 이전의 코드
- 정답 코드와 비슷한 로직으로 구현을 했지만, remain 리스트를 만들고 처리하는 부분을 생각해내지 못함
'백준 문제풀이' 카테고리의 다른 글
16234번: 인구 이동 / gold 5 / 구현, 시뮬레이션 (0) | 2023.07.12 |
---|---|
13023번: ABCDE / gold 5 / 백트래킹 (0) | 2023.06.20 |
14891번: 톱니바퀴 / gold 5 / 구현, 시뮬레이션 (0) | 2023.06.17 |
2583번: 영역 구하기 / silver 1 / DFS (0) | 2023.06.13 |
3085번: 사탕 게임 / silver 2 / 브루트포스 (0) | 2023.06.10 |