문제 : 스티커 붙이기
1) 맨 위 왼쪽에서 시작해서 오른쪽으로 한칸씩 가면서 시작지점 선택 -> 2)탐색 후 가능하면 graph 값 갱신, 불가능하면 rotate함수로 sticker 변수 전달해준 후 다시 1)로 -> 1의 갯수 센 다음에 total 출력
의 방식으로 도식화를 진행하였고 구현에 어려움은 없었으나 2개의 테스트 케이스에서 계속해서 에러 발생.
에러 발생 이유는 rotate 함수에 있었음. 회전의 기준을 잘못 잡아서 정 반대로 구현해버림.
초기 rotate 함수의 형태는 다음과 같았다
def rotate(sticker, r, c):
new_sticker = [[0 for i in range(r)] for j in range(c)]
for i in range(c):
for j in range(r):
new_sticker[i][j] = sticker[j][c-i-1]
return new_sticker
def rotate(sticker, r, c):
new_sticker = [[0 for i in range(r)] for j in range(c)]
for i in range(r):
for j in range(c):
new_sticker[j][r-i-1] = sticker[i][j]
return new_sticker
앞으로 배열의 회전 문제가 나올 시 일관성있게 기준을 원형 배열로 잡고 계산해야 할듯
n, m, k = map(int, input().split())
graph = [[0 for i in range(m)] for j in range(n)]
# n이 세로 m이 가로
def put_sticker(sticker, r, c):
# r이 세로 c이 가로
for ii in range(n - r + 1):
for jj in range(m - c + 1):
# ii와 jj는 시작점
flag = True
for _i in range(ii, ii + r):
for _j in range(jj, jj + c):
if graph[_i][_j] == 1 and sticker[_i - ii][_j - jj] == 1:
flag = False
if flag:
for _i in range(ii, ii + r):
for _j in range(jj, jj + c):
if sticker[_i - ii][_j - jj] == 1:
graph[_i][_j] = 1
return True
return False
# 4번 12 6번 22
def rotate(sticker, r, c):
new_sticker = [[0 for i in range(r)] for j in range(c)]
for i in range(r):
for j in range(c):
new_sticker[j][r-i-1] = sticker[i][j]
return new_sticker
# 회전할때 기존의 이차원 배열을 기준으로 돌리자
total = 0
for i in range(k):
r, c = map(int, input().split())
sticker = []
for j in range(r):
sticker.append(list(map(int, input().split())))
count = 0
while count < 4:
if put_sticker(sticker, r, c):
break
else:
sticker = rotate(sticker, r, c)
r, c = c, r
count += 1
for ii in range(len(graph)):
for jj in range(len(graph[0])):
if graph[ii][jj] == 1:
total += 1
print(total)