본문 바로가기
알고리즘/[python] 백준 BOJ

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

by Alan_Kim 2023. 11. 18.
728x90
반응형

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

 

18808번: 스티커 붙이기

혜윤이는 최근에 다양한 대회를 참여하면서 노트북에 붙일 수 있는 스티커들을 많이 받았다. 스티커는 아래와 같이 사각 모눈종이 위에 인쇄되어 있으며, 스티커의 각 칸은 상하좌우로 모두 연

www.acmicpc.net

 

문제 해결

  • 스티커를 붙이는 방법이 상세하게 나왔다. 최대한 있는 그대로 붙이려 하되, 안되면 90 오른쪽으로 회전해가며 붙여보고 그래도 안붙여지면 버리고 다른 것을 순서대로 붙이는 것이다.
  • 따라서 우리는 붙일 수 있는지 확인하고 붙여질 수 있으면 붙이고 옮겨가며 붙여보되, 안되면 회전을 시키고 반복하는 알고리즘을 짜면 된다.

 

CODE

import copy

def checking(r:int,c:int,i:int,j:int):
    global stick
    for y in range(r):
        for x in range(c):
            if board[i+y][j+x] + stick[y][x] > 1:
                return False
    return True

def attach(r:int,c:int,i:int,j:int):
    global stick
    for y in range(r):
        for x in range(c):
            board[i+y][j+x] += stick[y][x]
    return

def rotate(r:int,c:int):
    global stick
    result = [[0 for _ in range(r)] for _ in range(c)]
    # print(f"rotate 안에서 stick 행:{len(stick)} stick 열:{len(stick[0])}")
    for i in range(r):
        for j in range(c):
            result[j][r-i-1] = stick[i][j]    
    return result

def solve(n,m,r,c):
    global stick
    check = False
    cnt = 0
    while cnt<4:
        if check:break
        for i in range(n-r+1):
            if check:break
            for j in range(m-c+1):
                if checking(r,c,i,j):
                    attach(r,c,i,j)
                    check = True
                    break
        else:
            # print(f"stick 행:{r} stick 열:{c}")
            stick = rotate(r,c)
            r, c = c, r
            # print(f"stick 행:{r} stick 열:{c}")
            cnt += 1
        

if __name__=='__main__':
    n, m, k = map(int, input().split())
    board = [[0 for _ in range(m)] for _ in range(n)]
    for _ in range(k):
        r, c = map(int, input().split())
        stick = []
        for _ in range(r):
            stick.append(list(map(int,input().split())))
        solve(n,m,r,c)
    answer = 0
    for i in range(n):
        for j in range(m):
            answer += board[i][j]
    print(answer)
728x90
반응형

'알고리즘 > [python] 백준 BOJ' 카테고리의 다른 글

[python] 백준 11559 Puyo Puyo  (1) 2023.11.23
[python] 백준 1726 로봇  (1) 2023.11.22
[python] 백준 14215 세 막대  (0) 2023.11.17
[python] 백준 9063 대지  (1) 2023.11.16
[python] 백준 11664 선분과 점  (0) 2023.11.15

댓글