[백준 18808번] 스티커 붙이기

박형진·2023년 2월 9일
0

https://www.acmicpc.net/problem/18808


1. 코드

import sys


def rotate_90_degree(a):
    n = len(a)
    m = len(a[0])
    result = [[0] * n for _ in range(m)]
    for i in range(n):
        for j in range(m):
            result[j][n - 1 - i] = a[i][j]
    return result


def move_success_check(a, x, y):
    n = len(a)
    m = len(a[0])
    move_flag = True
    used = []
    for i in range(n):
        for j in range(m):
            if visited[i+x][j+y] and a[i][j] == 1:
                move_flag = False
            used.append((i+x, j+y, a[i][j]))

    if move_flag:
        for x, y, v in used:
            if v == 1:
                graph[x][y] = v
                visited[x][y] = True
             
        return True
    return False

N, M, K = map(int, sys.stdin.readline().rstrip().split())
graph = [[0] * M for _ in range(N)]
visited = [[False] * M for _ in range(N)]

for z in range(K):
    r, c = map(int, sys.stdin.readline().rstrip().split())
    sticker = [list(map(int, sys.stdin.readline().rstrip().split())) for _ in range(r)]

    for _ in range(4):
        cases = []
        flag = False
        for i in range(0, N-r+1):
            for j in range(0, M-c+1):
                cases.append((i, j))
        for x, y in cases:
            if move_success_check(sticker, x, y):
                flag = True
                break
        if flag:
            break
        else:
            sticker = rotate_90_degree(sticker)
            r, c = c, r
            
cnt = 0
for i in range(N):
    for j in range(M):
        if visited[i][j]:
            cnt += 1
print(cnt)

2. 후기

90도 회전, 좌표 한 칸씩 움직인 후 check. 두 가지 함수를 사용했다.

자주 쓰는 함수이므로 다시 정리해봐야 겠다.

profile
안녕하세요!

0개의 댓글