# 생각
좌측 상단부터 시작하기 때문에(0,0) 부터 (N-R, M-C)까지 각 칸을 시작점으로 두고
붙일 수 있다면 바로 붙이고 탐색을 종료한다
스티커를 붙일 수 있는지 판단은
스티커 배열과 노트북 배열을 비교하여 판단할 수 있다
단, 노트북은 스티커를 붙이기 시작하는 곳 부터 검사해야 하므로
(x, y)에 스티커 (0,0)이 올라가게 스티커를 붙일 수 있는지 판단하려면
[i + x][j +y]를 확인해 줘야한다
모든 칸에서도 스티커를 붙일 수 없다면
rotate90을 실행한다
# 전체 코드
// 2s, 512MB
// 40 * 40, 10 * 10, 1 <= K <= 100
#include <bits/stdc++.h>
using namespace std;
int N, M, K, R, C, ans;
int laptop[44][44], sticker[11][11];
// sitcker 배열 모양 체크를 위한 메서드
void print()
{
cout << '\n';
for (int i = 0; i < R; i++)
{
for (int j = 0; j < C; j++)
{
cout << sticker[i][j] << ' ';
}
cout << '\n';
}
}
// Sticker 입력
void inputSticker()
{
cin >> R >> C;
for (int i = 0; i < R; i++)
{
for (int j = 0; j < C; j++)
{
cin >> sticker[i][j];
}
}
}
// 노트북의 (i,j)에 (0,0)이 올라가게 스티커를 붙일 수 있는지 판단
bool canPaste(int x, int y)
{
for (int i = 0; i < R; i++)
{
for (int j = 0; j < C; j++)
{
if (sticker[i][j] == 1 and laptop[x + i][y + j] == 1) return false;
}
}
for (int i = 0; i < R; i++)
{
for (int j = 0; j < C; j++)
{
if (sticker[i][j] == 1) laptop[x + i][y + j] = 1;
}
}
return true;
}
void rotate90()
{
int tmp[11][11];
for (int i = 0; i < R; i++)
{
for (int j = 0; j < C; j++)
{
tmp[i][j] = sticker[i][j];
}
}
for (int i = 0; i < C; i++)
{
for (int j = 0; j < R; j++)
{
sticker[i][j] = tmp[R - 1 - j][i];
}
}
swap(R, C);
//print();
}
// 0도 부터 270도 까지 회전해보면서 붙일 수 있는 지 탐색
void func()
{
for (int dir = 0; dir < 4; dir++)
{
bool bPasted = false;
for (int i = 0; i <= N - R; i++) //(i,j)를 시작점으로 스티커를 붙여본다
{
if (bPasted) break; // 해당 스티커를 붙였다면 break
for (int j = 0; j <= M - C; j++)
{
if (canPaste(i, j))
{
bPasted = true;
break;
}
}
}
if (bPasted) break;
rotate90(); // 못 붙였다면 회전
}
}
// 스티커가 붙어 있는 칸을 센다
void output()
{
for (int i = 0; i < N; i++)
{
for (int j = 0; j < M; j++)
{
ans += laptop[i][j];
}
}
cout << ans << '\n';
}
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
cin >> N >> M >> K;
while (K--)
{
inputSticker();
func();
}
output();
}
https://www.acmicpc.net/problem/18808
18808번: 스티커 붙이기
혜윤이는 최근에 다양한 대회를 참여하면서 노트북에 붙일 수 있는 스티커들을 많이 받았다. 스티커는 아래와 같이 사각 모눈종이 위에 인쇄되어 있으며, 스티커의 각 칸은 상하좌우로 모두 연
www.acmicpc.net
'Algorithm > BOJ' 카테고리의 다른 글
[BOJ] 2751_수 정렬하기 2 with cpp (0) | 2022.02.28 |
---|---|
[BOJ] 2750_수 정렬하기 with cpp (0) | 2022.02.28 |
[BOJ] 11651_좌표 정렬하기 2 with cpp (0) | 2022.02.20 |
[BOJ] 11650_좌표 정렬하기 with cpp (0) | 2022.02.19 |
[BOJ] 10814_나이순 정렬 with cpp (0) | 2022.02.18 |