https://www.acmicpc.net/problem/18808
๋ฌธ์
ํ์ค์ด๋ ์ต๊ทผ์ ๋ค์ํ ๋ํ๋ฅผ ์ฐธ์ฌํ๋ฉด์ ๋ ธํธ๋ถ์ ๋ถ์ผ ์ ์๋ ์คํฐ์ปค๋ค์ ๋ง์ด ๋ฐ์๋ค. ์คํฐ์ปค๋ ์๋์ ๊ฐ์ด ์ฌ๊ฐ ๋ชจ๋์ข ์ด ์์ ์ธ์๋์ด ์์ผ๋ฉฐ, ์คํฐ์ปค์ ๊ฐ ์นธ์ ์ํ์ข์ฐ๋ก ๋ชจ๋ ์ฐ๊ฒฐ๋์ด ์๋ค. ๋ํ ๋ชจ๋์ข ์ด์ ํฌ๊ธฐ๋ ์คํฐ์ปค์ ํฌ๊ธฐ์ ๊ผญ ๋ง์์, ์ํ์ข์ฐ์ ์คํฐ์ปค๊ฐ ํฌํจ๋์ง ์๋ ๋ถํ์ํ ํ์ด๋ ์ด์ด ์กด์ฌํ์ง ์๋๋ค.
์๋๋ ์ฌ๋ฐ๋ฅธ ๋ชจ๋์ข ์ด์ ์์์ด๋ค. ์ฃผํฉ์ ์นธ์ ์คํฐ์ปค๊ฐ ๋ถ์ ์นธ์, ํ์์ ์นธ์ ์คํฐ์ปค๊ฐ ๋ถ์ง ์์ ์นธ์ ๋ํ๋ธ๋ค.
๋ฐ๋ฉด ์๋๋ ์ฌ๋ฐ๋ฅด์ง ์์ ๋ชจ๋์ข ์ด์ ์์์ด๋ค. ์ฒซ ๋ฒ์งธ๋ ์์ชฝ์ ๋ถํ์ํ ํ์ด ์๊ณ , ๋ ๋ฒ์งธ๋ ์ผ์ชฝ์ ๋ถํ์ํ ์ด์ด ์๋ค. ๊ทธ๋ฆฌ๊ณ ์ธ ๋ฒ์งธ๋ ์คํฐ์ปค์ ๊ฐ ์นธ์ด ์ํ์ข์ฐ๋ก ๋ชจ๋ ์ฐ๊ฒฐ๋์ด ์์ง ์๋ค.
ํ์ค์ด๋ ์์ ์ ๋ ธํธ๋ถ์ ์ด ์คํฐ์ปค๋ค์ ๋ถ์ด๊ธฐ๋ก ํ๋ค. ํ์ค์ด์ ๋ ธํธ๋ถ์ ๋ง์นจ ์ง์ฌ๊ฐํ ๋ชจ์์ด๊ณ , ์คํฐ์ปค๊ฐ ์ธ์๋ ๋ชจ๋์ข ์ด์ ๊ฐ์ ๊ฐ๊ฒฉ์ผ๋ก ๊ฒฉ์๊ฐ ๊ทธ๋ ค์ ธ ์๋ค. ํ์ค์ด๋ ์คํฐ์ปค๋ค์ ๋จผ์ ๋ฐ์๋ ๊ฒ๋ถํฐ ์ฐจ๋ก๋๋ก ๊ฒฉ์์ ๋ง์ถฐ์ ๋ถ์ด๋ ค๊ณ ํ๋ค.
ํ์ค์ด๊ฐ ์คํฐ์ปค๋ฅผ ๋ถ์ด๋ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ๋ค.
- ์คํฐ์ปค๋ฅผ ํ์ ์ํค์ง ์๊ณ ๋ชจ๋์ข ์ด์์ ๋ผ์ด๋ธ๋ค.
- ๋ค๋ฅธ ์คํฐ์ปค์ ๊ฒน์น๊ฑฐ๋ ๋ ธํธ๋ถ์ ๋ฒ์ด๋์ง ์์ผ๋ฉด์ ์คํฐ์ปค๋ฅผ ๋ถ์ผ ์ ์๋ ์์น๋ฅผ ์ฐพ๋๋ค. ํ์ค์ด๋ ๋ ธํธ๋ถ์ ์์ชฝ๋ถํฐ ์คํฐ์ปค๋ฅผ ์ฑ์ ๋๊ฐ๋ ค๊ณ ํด์, ์คํฐ์ปค๋ฅผ ๋ถ์ผ ์ ์๋ ์์น๊ฐ ์ฌ๋ฌ ๊ณณ ์๋ค๋ฉด ๊ฐ์ฅ ์์ชฝ์ ์์น๋ฅผ ์ ํํ๋ค. ๊ฐ์ฅ ์์ชฝ์ ํด๋นํ๋ ์์น๋ ์ฌ๋ฌ ๊ณณ์ด ์๋ค๋ฉด ๊ทธ์ค์์ ๊ฐ์ฅ ์ผ์ชฝ์ ์์น๋ฅผ ์ ํํ๋ค.
- ์ ํํ ์์น์ ์คํฐ์ปค๋ฅผ ๋ถ์ธ๋ค. ๋ง์ฝ ์คํฐ์ปค๋ฅผ ๋ถ์ผ ์ ์๋ ์์น๊ฐ ์ ํ ์์ด์ ์คํฐ์ปค๋ฅผ ๋ถ์ด์ง ๋ชปํ๋ค๋ฉด, ์คํฐ์ปค๋ฅผ ์๊ณ ๋ฐฉํฅ์ผ๋ก 90๋ ํ์ ํ ๋ค 2๋ฒ ๊ณผ์ ์ ๋ฐ๋ณตํ๋ค.
- ์์ ๊ณผ์ ์ ๋ค ๋ฒ ๋ฐ๋ณตํด์ ์คํฐ์ปค๋ฅผ 0๋, 90๋, 180๋, 270๋ ํ์ ์์ผ ๋ดค์์๋ ์คํฐ์ปค๋ฅผ ๋ถ์ด์ง ๋ชปํ๋ค๋ฉด ํด๋น ์คํฐ์ปค๋ฅผ ๋ถ์ด์ง ์๊ณ ๋ฒ๋ฆฐ๋ค.
ํ์ค์ด๋ ์คํฐ์ปค๋ฅผ ๋ค ๋ถ์ธ ํ์ ๋ ธํธ๋ถ์ ๋ชจ์ต์ด ๊ถ๊ธํด์ก๋ค. ๋ ธํธ๋ถ์ ํฌ๊ธฐ์ ์คํฐ์ปค๋ค์ด ์ฃผ์ด์ก์ ๋ ์คํฐ์ปค๋ค์ ์ฐจ๋ก๋๋ก ๋ถ์ด๊ณ ๋ ํ ๋ ธํธ๋ถ์์ ๋ช ๊ฐ์ ์นธ์ด ์ฑ์์ก๋์ง ๊ตฌํด๋ณด์.
์ ๋ ฅ
์ฒซ์งธ ์ค์ ๋ ธํธ๋ถ์ ์ธ๋ก์ ๊ฐ๋ก ๊ธธ์ด๋ฅผ ๋ํ๋ด๋ N(1 ≤ N ≤ 40)๊ณผ M(1 ≤ M ≤ 40), ๊ทธ๋ฆฌ๊ณ ์คํฐ์ปค์ ๊ฐ์ K(1 ≤ K ≤ 100)์ด ํ ์นธ์ ๋น์นธ์ ์ฌ์ด์ ๋๊ณ ์ฃผ์ด์ง๋ค.
๊ทธ ๋ค์ ์ค๋ถํฐ๋ K๊ฐ์ ์คํฐ์ปค๋ค์ ๋ํ ์ ๋ณด๊ฐ ์ฃผ์ด์ง๋ค. ๊ฐ ์คํฐ์ปค๋ ์๋์ ๊ฐ์ ํ์์ผ๋ก ์ฃผ์ด์ง๋ค.
๋จผ์ i๋ฒ์งธ ์คํฐ์ปค๊ฐ ์ธ์๋ ๋ชจ๋์ข ์ด์ ํ์ ๊ฐ์์ ์ด์ ๊ฐ์๋ฅผ ๋ํ๋ด๋ Ri(1 ≤ Ri ≤ 10)์ Ci(1 ≤ Ci ≤ 10)๊ฐ ํ ์นธ์ ๋น์นธ์ ์ฌ์ด์ ๋๊ณ ์ฃผ์ด์ง๋ค.
๋ค์ Ri๊ฐ์ ์ค์๋ ๊ฐ ์ค๋ง๋ค ๋ชจ๋์ข ์ด์ ๊ฐ ํ์ ๋ํ๋ด๋ Ci๊ฐ์ ์ ์๊ฐ ํ ๊ฐ์ ๋น์นธ์ ์ฌ์ด์ ๋๊ณ ์ฃผ์ด์ง๋ค. ๊ฐ ์นธ์ ๋ค์ด๊ฐ๋ ๊ฐ์ 0, 1์ด๋ค. 0์ ์คํฐ์ปค๊ฐ ๋ถ์ง ์์ ์นธ์, 1์ ์คํฐ์ปค๊ฐ ๋ถ์ ์นธ์ ์๋ฏธํ๋ค.
๋ฌธ์ ์์ ์ค๋ช ํ ๊ฒ๊ณผ ๊ฐ์ด ์คํฐ์ปค๋ ๋ชจ๋ ์ฌ๋ฐ๋ฅธ ๋ชจ๋์ข ์ด์ ์ธ์๋์ด ์๋ค. ๊ตฌ์ฒด์ ์ผ๋ก ์คํฐ์ปค์ ๊ฐ ์นธ์ ์ํ์ข์ฐ๋ก ๋ชจ๋ ์ฐ๊ฒฐ๋์ด ์๊ณ , ๋ชจ๋์ข ์ด์ ํฌ๊ธฐ๋ ์คํฐ์ปค์ ํฌ๊ธฐ์ ๊ผญ ๋ง์์ ์ํ์ข์ฐ์ ์คํฐ์ปค์ ์ ํ ํฌํจ๋์ง ์๋ ๋ถํ์ํ ํ์ด๋ ์ด์ด ์กด์ฌํ์ง ์๋๋ค.
์ถ๋ ฅ
์ฒซ์งธ ์ค์ ์ฃผ์ด์ง ์คํฐ์ปค๋ค์ ์ฐจ๋ก๋๋ก ๋ถ์์ ๋ ๋ ธํธ๋ถ์์ ์คํฐ์ปค๊ฐ ๋ถ์ ์นธ์ ์๋ฅผ ์ถ๋ ฅํ๋ค.
ํ์ด
๊ตฌํํ๋ค๊ฐ ์ฐ๋ฌ์ง๋ ์ค ์์๋ค
์คํฐ์ปค๋ฅผ ๋ฐ์๋ง์ ํด๋น ์คํฐ์ปค๋ฅผ ๋ถ์ด๊ณ
์ด๋ฅผ ๋ฐ๋ณตํ ๋ค์ ์คํฐ์ปค๊ฐ ๋ถ์ ์์ญ์ ์นด์ดํธ ํ๋ฉด ๋์ด๋ค
์๋๋ ์คํฐ์ปค๋ฅผ ๋ถ์ด๋ ๊ณผ์ ์ด๋ค
1. ์ฃผ์ด์ง ์คํฐ์ปค๋ฅผ ๋ถ์ผ ์ ์๋ ์์ญ์ ์,์ผ -> ์๋,์ค ๋ฐฉํฅ์ผ๋ก ํ์ํ๋ค (by ์ด์ค for๋ฌธ)
2. ๋ถ์ผ ์ ์๋ ๊ณต๊ฐ์ด ์๋ค๋ฉด
3. ๋ถ์ธ๋ค
4. ์์ญ์ ๋ค ํ์ํ๋๋ฐ ๋ถ์ผ ์ ์๋ ๊ณต๊ฐ์ด ์๋ค๋ฉด
5. ์คํฐ์ปค๋ฅผ ๋๋ฆฐ๋ค
// ๋ถ์ผ ์ ์๋ ์์ญ ์ฐพ์์ ๋ถ์ด๊ธฐ
void findAndPut() {
for(int dir=0; dir<4; dir++) {
for(int i=0; i<=n-r; i++) { // ์,์ผ์ชฝ ๋ถํฐ ํ์
for(int j=0; j<=m-c; j++) {
if(isPossible(i,j)) {
// ๋ถ์ผ ์ ์๋ ๊ณต๊ฐ์ด ์๋ค๋ฉด
putSticker(i,j); // ๋ถ์ธ๋ค
return;
}
}
}
// ๋ค ํ์ํ์ง๋ง ๋ถ์ผ ๊ณต๊ฐ์ด ์๋ค๋ฉด
rotateSticker(); // ๋๋ฆฐ๋ค
}
}
2๋ฒ : x,y๊ฐ ๋ถ์ผ ์ ์๋ ๊ณต๊ฐ์ธ์ง ์๋์ง ํ์ํ๋ ํจ์
// x,y ์์น์ ์คํฐ์ปค ๋ถ์ผ ์ ์๋?
bool isPossible(int x, int y) {
for(int i=0; i<r; i++) {
for(int j=0; j<c; j++) {
if(sticker[i][j] && board[x+i][y+j]) {
return false;
}
}
}
return true;
}
3๋ฒ : ์คํฐ์ปค๋ฅผ ๋ ธํธ๋ถ์ x,y์์น์ ๋ถ์ด๋ ํจ์
// x,y ์์น์ ์คํฐ์ปค ๋ถ์ด๊ธฐ
void putSticker(int x, int y) {
for(int i=0; i<r; i++) {
for(int j=0; j<c; j++) {
if(sticker[i][j]) {
board[x+i][y+j] = true;
}
}
}
return;
}
5๋ฒ : ์คํฐ์ปค๋ฅผ ์๊ณ๋ฐฉํฅ์ผ๋ก 90๋ ๋๋ฆฌ๋ ํจ์
// ์คํฐ์ปค ์๊ณ๋ฐฉํฅ์ผ๋ก 90๋ ๋๋ฆฌ๊ธฐ
void rotateSticker() {
vector<vector<int>>tmp = sticker;
sticker.assign(c, vector<int>(r));
for(int i=0; i<r; i++) {
for(int j=0; j<c; j++) {
sticker[j][r-1-i] = tmp[i][j];
}
}
// r๊ณผ c ๊ต์ฒด
r = r+c;
c = r-c;
r = r-c;
return;
}
์ฝ๋
// ํ์ด : https://whkakrkr.tistory.com
#include <iostream>
#include <vector>
using namespace std;
typedef pair<int, int> ci;
int n,m,k, r,c;
vector<vector<bool>>board; // ๋
ธํธ๋ถ ์์ญ
vector<vector<int>>sticker; // ํ์ฌ ์คํฐ์ปค
// x,y ์์น์ ์คํฐ์ปค ๋ถ์ผ ์ ์๋?
bool isPossible(int x, int y) {
for(int i=0; i<r; i++) {
for(int j=0; j<c; j++) {
if(sticker[i][j] && board[x+i][y+j]) {
return false;
}
}
}
return true;
}
// x,y ์์น์ ์คํฐ์ปค ๋ถ์ด๊ธฐ
void putSticker(int x, int y) {
for(int i=0; i<r; i++) {
for(int j=0; j<c; j++) {
if(sticker[i][j]) {
board[x+i][y+j] = true;
}
}
}
return;
}
// ์คํฐ์ปค ์๊ณ๋ฐฉํฅ์ผ๋ก 90๋ ๋๋ฆฌ๊ธฐ
void rotateSticker() {
vector<vector<int>>tmp = sticker;
sticker.assign(c, vector<int>(r));
for(int i=0; i<r; i++) {
for(int j=0; j<c; j++) {
sticker[j][r-1-i] = tmp[i][j];
}
}
// r๊ณผ c ๊ต์ฒด
r = r+c;
c = r-c;
r = r-c;
return;
}
// ๋ถ์ผ ์ ์๋ ์์ญ ์ฐพ์์ ๋ถ์ด๊ธฐ
void findAndPut() {
for(int dir=0; dir<4; dir++) {
for(int i=0; i<=n-r; i++) { // ์,์ผ์ชฝ ๋ถํฐ ํ์
for(int j=0; j<=m-c; j++) {
if(isPossible(i,j)) {
// ๋ถ์ผ ์ ์๋ ๊ณต๊ฐ์ด ์๋ค๋ฉด
putSticker(i,j); // ๋ถ์ธ๋ค
return;
}
}
}
// ๋ค ํ์ํ์ง๋ง ๋ถ์ผ ๊ณต๊ฐ์ด ์๋ค๋ฉด
rotateSticker(); // ๋๋ฆฐ๋ค
}
}
int main() {
cin >> n >> m >> k;
board.assign(n, vector<bool>(m, false));
while(k--) {
// ์คํฐ์ปค ์
๋ ฅ๋ฐ๊ธฐ
cin >> r >> c;
sticker.assign(r, vector<int>(c));
for(int i=0; i<r; i++) {
for(int j=0; j<c; j++) {
cin >> sticker[i][j];
}
}
// ์คํฐ์ปค ๋ถ์ด๊ธฐ
findAndPut();
// ๋๋ฒ๊น
์ฉ
// for(int i=0; i<n; i++) {
// for(int j=0; j<n; j++) {
// cout << board[i][j] << " ";
// }
// cout << "\n";
// }
// cout << "\n";
}
// ๋จ์ ๊ณต๊ฐ ์นด์ดํธ
int cnt = 0;
for(int i=0; i<n; i++) {
for(int j=0; j<m; j++) {
if(board[i][j]) {
cnt++;
}
}
}
// ์ถ๋ ฅ
cout << cnt;
return 0;
}
'๐๏ธ ICPC Sinchon > Bruteforce' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[BOJ][C++] ๋ฐฑ์ค 6064๋ฒ: ์นด์ ๋ฌ๋ ฅ (0) | 2024.08.12 |
---|---|
[BOJ][C++] ๋ฐฑ์ค 2309๋ฒ: ์ผ๊ณฑ ๋์์ด (0) | 2023.01.19 |
[BOJ S2][C++] ๋ฐฑ์ค 14620๋ฒ: ๊ฝ๊ธธ (0) | 2022.09.24 |
[BOJ S4][C++] ๋ฐฑ์ค 1544๋ฒ: ์ฌ์ดํด ๋จ์ด (0) | 2022.09.21 |
[BOJ][C++] ๋ฐฑ์ค 14889๋ฒ: ์คํํธ์ ๋งํฌ (0) | 2022.09.17 |