[18808] 스티커 붙이기

2023. 6. 19. 15:59·Coding Test/Implement
728x90
 

18808번: 스티커 붙이기

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

www.acmicpc.net

 

풀이

"""
가장 위, 왼쪽부터 붙임
자리없으면 시계방향으로 90도 회전
0도, 90도, 180도, 270도 회전해도 없으면 버림

노트북 세로, 가로 N,M(1 ≤ M ≤ 40), 스티커 개수 K(1 ≤ K ≤ 100)
i번째 스티커가 인쇄된 모눈종이의 행의 개수와 열의 개수를 나타내는 Ri(1 ≤ Ri ≤ 10)와 Ci(1 ≤ Ci ≤ 10)
Ri개의 줄에는 각 줄마다 모눈종이의 각 행을 나타내는 Ci개의 정수가 한 개
첫째 줄에 주어진 스티커들을 차례대로 붙였을 때 노트북에서 스티커가 붙은 칸의 수를 출력
"""
import sys
import copy

input=sys.stdin.readline
sys.setrecursionlimit(10**9)

n,m,k=map(int, input().split())
board=[[0]*m for _ in range(n)]
stickers=[]
for _ in range(k):
    x,y=map(int, input().split())
    tmp=[]
    for _ in range(x):
        tmp.append(list(map(int,input().split())))
    stickers.append(tmp)

# 네방향
dr=[0,1,0,-1]
dc=[1,0,-1,0]


# 스티커 90도 회전
def rotate(sticker):
    c, r = len(sticker), len(sticker[0])
    temp = [[0 for _ in range(c)] for _ in range(r)]
    for i in range(r):
        for j in range(c):
            temp[i][j] = sticker[c-1-j][i]
    return temp

# 붙이기 체크
def check(sticker, y, x):
    r, c = len(sticker), len(sticker[0])

    for i in range(r):
        for j in range(c):
            if sticker[i][j] == 1 and board[y+i][x+j] == 1:  # 이미 붙어있는 경우
                return False

    # 붙이기
    for i in range(r):
        for j in range(c):
            if sticker[i][j] == 1:
                board[y+i][x+j] = 1
    return True

for s in stickers:
    direction = 1  # 스티커 방향 (회전여부)
    while True:
        flag = False
        r, c = len(s), len(s[0])  # 스티커 길이
        for y in range(n-(r-1)):
            for x in range(m-(c-1)):
                if check(s,y,x):  # 붙일수있다면
                    flag = True
                    break
            if flag:  # 붙였다면 다음 스티커로
                break
        if not flag:
            if direction==0:  # 네번(360도) 돌렸으면
                break
            s = rotate(s)  # 스티커 돌리기
            direction=(direction+1)%4  # 방향 돌린
        elif flag:
            break

# print(board)

cnt=0
for i in range(n):
    for j in range(m):
        if board[i][j]==1:
            cnt+=1

print(cnt)

 

 

 

728x90
저작자표시 비영리 변경금지 (새창열림)
'Coding Test/Implement' 카테고리의 다른 글
  • [15686] 치킨 배달 (DFS, 브루트포스, 백트래킹)
  • [12100] 2048 (Easy)
  • [15683] 감시 (DFS, 백트래킹, 브루트포스)
  • [6996] 애너그램
Karla Ko
Karla Ko
𝘾𝙤𝙣𝙩𝙞𝙣𝙪𝙤𝙪𝙨𝙡𝙮 𝙄𝙢𝙥𝙧𝙤𝙫𝙞𝙣𝙜, 𝘾𝙤𝙣𝙨𝙩𝙖𝙣𝙩𝙡𝙮 𝘿𝙚𝙫𝙚𝙡𝙤𝙥𝙞𝙣𝙜 𝙔𝙚𝙨!
    250x250
  • Karla Ko
    karlaLog
    Karla Ko
  • 전체
    오늘
    어제
    • Total (461)
      • AI (1)
      • Infra (13)
        • Architecture (2)
        • Kubernetes (5)
        • Docker (3)
        • Cloud (1)
        • DevOps (1)
        • Monitoring (1)
      • Message Queue (4)
        • Kafka (2)
        • RabbitMQ (2)
      • Spring (19)
      • JPA (4)
      • Language (9)
        • Kotlin (1)
        • Java (8)
      • Git (4)
      • DB (4)
      • CS (11)
        • OS (8)
        • Network (2)
        • Algorithm (1)
      • Coding Test (392)
        • programmers (156)
        • Graph (43)
        • DP (37)
        • Search (31)
        • Tree (13)
        • Data Structure (26)
        • Combination (12)
        • Implement (18)
        • Geedy (23)
        • Sort (7)
        • Math (21)
        • geometry (2)
  • 블로그 메뉴

    • 홈
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    그래프
    구간합
    플로이드워셜
    구현
    Algorithm
    트리
    조합
    월간코드챌린지
    최단거리
    이분탐색
    정렬
    백준
    BFS
    DFS
    재귀
    DP
    알고리즘
    자료구조
    LIS
    덱
    힙
    최소신장트리
    그리디
    스택
    최대공약수
    파이썬
    큐
    프로그래머스
    동적계획법
    다익스트라
  • hELLO· Designed By정상우.v4.10.3
Karla Ko
[18808] 스티커 붙이기
상단으로

티스토리툴바