๋ฌธ์
https://www.acmicpc.net/problem/18808
๋ฐฑ์ค ๋ฌธ์ ์ง - 0x0D๊ฐ - ์๋ฎฌ๋ ์ด์
์๊ณ ๋ฆฌ์ฆ: ๋ธ๋ฃจํธํฌ์ค, ์๋ฎฌ๋ ์ด์
ํ์ด
์ฃผ์ด์ง ์คํฐ์ปค๋ค์ ์กฐ๊ฑด์ ๋ง๊ฒ ๋ถ์ฌ๋๊ฐ๋ ๋ฌธ์ ๋ค.
- ๊ฒน์ณ์ ๋ถ์ด์ง ๋ง๊ฒ.
- ์ผ์ชฝ ์๋จ, ์ค๋ฅธ์ชฝ ์๋จ, ์ผ์ชฝ ํ๋จ, ์ค๋ฅธ์ชฝ ํ๋จ ์์ผ๋ก ์ฐ์ ์์๋ฅผ ๋๊ณ ๋ถ์ผ๊ฒ.
- ๋ถ์ผ ์ ์๋ ์ํฉ์ด๋ผ๋ฉด ์คํฐ์ปค๋ฅผ 90๋์ฉ ํ์ ์์ผ๋ณธ ํ ๋ค์ ์๋
์ ๋ณด๋ฉด '์ต๋ํ ๋ง์ด ๋ถ์ผ์์๋ ๊ฒฝ์ฐ'๋ฅผ ๊ตฌํ๋๊ฒ ์๋๋ค.
๋จ์ํ 1๋ฒ ์คํฐ์ปค๋ถํฐ K๋ฒ ์คํฐ์ปค๊น์ง ๋ถ์ผ ์ ์๋ ๊ฒฝ์ฐ์๋ง ๋ถ์ฌ๋๊ฐ๋ฉด ๋๋ค.
๋จผ์ ๊ฐ ์คํฐ์ปค๋ค์ ๋ฆฌ์คํธ์ ์ ์ฅํ ๋ค ํ๋์ฉ ์ํํ๋ค.
์คํฐ์ปค๋ฅผ 0º(๊ธฐ๋ณธ), 90º, 180º, 270º ์ฉ ๋๋ ค๊ฐ๋ฉฐ ๋ฐฉํฅ ์ฐ์ ์์์ ๋ง์ถฐ ๋
ธํธ๋ถ์ ๋ถ์ผ ์ ์๋์ง ์ฒดํฌํ๋ค.
๋ถ์ผ ์ ์๋ค๋ฉด ๋ถ์ธ ํ ๋ฐ๋ก ๋ค์ ์คํฐ์ปค๋ก ๋์ด๊ฐ๋ค.
๊ทธ๋ผ ์คํฐ์ปค๋ฅผ ํ์ ์ํฌ ํจ์, ๋ถ์ผ ์ ์๋์ง ์ฒดํฌํ๋ ํจ์, ์ค์ ๋ก ๋ถ์ด๋ ํจ์๊ฐ ํ์ํ๋ค.
ํ์ ํจ์๋ ์๊ฐ๋ณด๋ค ๊ฐ๋จํ๋ค.
R x C ํฌ๊ธฐ์ ๋ฆฌ์คํธ arr์ด ์๊ณ , ์ด๊ฑธ 90º ํ์ ์ํจ ๋ฆฌ์คํธ๋ฅผ rotated๋ผ๊ณ ๊ฐ์ ํด๋ณด์.rotated๋ C x R ํฌ๊ธฐ์ ๋ฆฌ์คํธ๊ฐ ๋ ๊ฒ์ด๋ค.
๊ทธ๋ฆฌ๊ณ ๊ฐ๊ฐ์ ์์น๊ฐ์ ๊ณ์ฐํด๋ณด๋ฉด, rotated[j][R-1-i] = arr[i][j]๊ฐ ๋๋ค.
111
000
01
01
01
์ฒดํฌํจ์์์๋ ๋จผ์ ํ์ฌ ์ขํ(x, y)์์ ์คํฐ์ปค์ ํฌ๊ธฐ๋งํผ ๋ํ ๊ฐ์ด R, C๋ณด๋ค ํฐ ๊ฒฝ์ฐ ๋ฐ๋ก False๋ฅผ ๋ฐํํด์ค๋ค.
๊ทธ๋ฆฌ๊ณ ๋ฐ๋ณต๋ฌธ์ ํตํด ์คํฐ์ปค์ ๊ฐ ์ขํ๋ฅผ ํ์ธํ๋ค.
ํด๋น ์ขํ์ ์ด๋ฏธ ๋ค๋ฅธ ์คํฐ์ปค๊ฐ ์กด์ฌํ๋ค๋ฉด ๋ฐ๋ก False, ์ขํ๋ฅผ ๋ค ๊ฒ์ฌํ ๋๊น์ง ๊ฑธ๋ฆฌ์ง ์๋๋ค๋ฉด True๋ฅผ ๋ฐํํ๋ค.
์ ์ฒด ์ฝ๋
# ๋ฉ๋ชจ๋ฆฌ: 31120KB / ์๊ฐ: 228ms
from sys import stdin
input = stdin.readline
def rotate(sticker):
R, C = len(sticker), len(sticker[0])
rotated = [[0] * R for _ in range(C)]
for i in range(R):
for j in range(C):
rotated[j][R-1-i] = sticker[i][j]
return rotated
def checking(sticker, x, y):
R, C = len(sticker), len(sticker[0])
if x + R > N or y + C > M:
return False
for i in range(R):
for j in range(C):
if sticker[i][j] == 1:
if board[x+i][y+j] == 1:
return False
return True
def placing(sticker, x, y):
R, C = len(sticker), len(sticker[0])
for i in range(R):
for j in range(C):
if sticker[i][j] == 1:
board[x+i][y+j] = 1
N, M, K = map(int, input().split())
board = [[0] * M for _ in range(N)]
stickers = []
for _ in range(K):
R, C = map(int, input().split())
sticker = [list(map(int, input().split())) for _ in range(R)]
stickers.append(sticker)
for sticker in stickers:
for _ in range(4):
placed = False
for i in range(N):
for j in range(M):
if checking(sticker, i, j):
placing(sticker, i, j)
placed = True
break # j ๋น ์ ธ๋์ด
if placed:
break # i ๋น ์ ธ๋์ด
if placed:
break # ๋ฐฉํฅ for๋ฌธ ๋น ์ ธ๋์ด
sticker = rotate(sticker)
ret = sum(sum(line) for line in board)
print(ret)