๐Ÿ•๏ธ ICPC Sinchon/Bruteforce

[BOJ][C++] ๋ฐฑ์ค€ 18808๋ฒˆ: ์Šคํ‹ฐ์ปค ๋ถ™์ด๊ธฐ

์„ ๋‹ฌ 2024. 9. 4. 21:45
๋ฐ˜์‘ํ˜•

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

 

๋ฌธ์ œ

ํ˜œ์œค์ด๋Š” ์ตœ๊ทผ์— ๋‹ค์–‘ํ•œ ๋Œ€ํšŒ๋ฅผ ์ฐธ์—ฌํ•˜๋ฉด์„œ ๋…ธํŠธ๋ถ์— ๋ถ™์ผ ์ˆ˜ ์žˆ๋Š” ์Šคํ‹ฐ์ปค๋“ค์„ ๋งŽ์ด ๋ฐ›์•˜๋‹ค. ์Šคํ‹ฐ์ปค๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ์‚ฌ๊ฐ ๋ชจ๋ˆˆ์ข…์ด ์œ„์— ์ธ์‡„๋˜์–ด ์žˆ์œผ๋ฉฐ, ์Šคํ‹ฐ์ปค์˜ ๊ฐ ์นธ์€ ์ƒํ•˜์ขŒ์šฐ๋กœ ๋ชจ๋‘ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋‹ค. ๋˜ํ•œ ๋ชจ๋ˆˆ์ข…์ด์˜ ํฌ๊ธฐ๋Š” ์Šคํ‹ฐ์ปค์˜ ํฌ๊ธฐ์— ๊ผญ ๋งž์•„์„œ, ์ƒํ•˜์ขŒ์šฐ์— ์Šคํ‹ฐ์ปค๊ฐ€ ํฌํ•จ๋˜์ง€ ์•Š๋Š” ๋ถˆํ•„์š”ํ•œ ํ–‰์ด๋‚˜ ์—ด์ด ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค.

์•„๋ž˜๋Š” ์˜ฌ๋ฐ”๋ฅธ ๋ชจ๋ˆˆ์ข…์ด์˜ ์˜ˆ์‹œ์ด๋‹ค. ์ฃผํ™ฉ์ƒ‰ ์นธ์€ ์Šคํ‹ฐ์ปค๊ฐ€ ๋ถ™์€ ์นธ์„, ํ•˜์–€์ƒ‰ ์นธ์€ ์Šคํ‹ฐ์ปค๊ฐ€ ๋ถ™์ง€ ์•Š์€ ์นธ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.

 

๋ฐ˜๋ฉด ์•„๋ž˜๋Š” ์˜ฌ๋ฐ”๋ฅด์ง€ ์•Š์€ ๋ชจ๋ˆˆ์ข…์ด์˜ ์˜ˆ์‹œ์ด๋‹ค. ์ฒซ ๋ฒˆ์งธ๋Š” ์œ—์ชฝ์— ๋ถˆํ•„์š”ํ•œ ํ–‰์ด ์žˆ๊ณ , ๋‘ ๋ฒˆ์งธ๋Š” ์™ผ์ชฝ์— ๋ถˆํ•„์š”ํ•œ ์—ด์ด ์žˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์„ธ ๋ฒˆ์งธ๋Š” ์Šคํ‹ฐ์ปค์˜ ๊ฐ ์นธ์ด ์ƒํ•˜์ขŒ์šฐ๋กœ ๋ชจ๋‘ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์ง€ ์•Š๋‹ค.

 

ํ˜œ์œค์ด๋Š” ์ž์‹ ์˜ ๋…ธํŠธ๋ถ์— ์ด ์Šคํ‹ฐ์ปค๋“ค์„ ๋ถ™์ด๊ธฐ๋กœ ํ–ˆ๋‹ค. ํ˜œ์œค์ด์˜ ๋…ธํŠธ๋ถ์€ ๋งˆ์นจ ์ง์‚ฌ๊ฐํ˜• ๋ชจ์–‘์ด๊ณ , ์Šคํ‹ฐ์ปค๊ฐ€ ์ธ์‡„๋œ ๋ชจ๋ˆˆ์ข…์ด์™€ ๊ฐ™์€ ๊ฐ„๊ฒฉ์œผ๋กœ ๊ฒฉ์ž๊ฐ€ ๊ทธ๋ ค์ ธ ์žˆ๋‹ค. ํ˜œ์œค์ด๋Š” ์Šคํ‹ฐ์ปค๋“ค์„ ๋จผ์ € ๋ฐ›์•˜๋˜ ๊ฒƒ๋ถ€ํ„ฐ ์ฐจ๋ก€๋Œ€๋กœ ๊ฒฉ์ž์— ๋งž์ถฐ์„œ ๋ถ™์ด๋ ค๊ณ  ํ•œ๋‹ค.

ํ˜œ์œค์ด๊ฐ€ ์Šคํ‹ฐ์ปค๋ฅผ ๋ถ™์ด๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  1. ์Šคํ‹ฐ์ปค๋ฅผ ํšŒ์ „์‹œํ‚ค์ง€ ์•Š๊ณ  ๋ชจ๋ˆˆ์ข…์ด์—์„œ ๋–ผ์–ด๋‚ธ๋‹ค.
  2. ๋‹ค๋ฅธ ์Šคํ‹ฐ์ปค์™€ ๊ฒน์น˜๊ฑฐ๋‚˜ ๋…ธํŠธ๋ถ์„ ๋ฒ—์–ด๋‚˜์ง€ ์•Š์œผ๋ฉด์„œ ์Šคํ‹ฐ์ปค๋ฅผ ๋ถ™์ผ ์ˆ˜ ์žˆ๋Š” ์œ„์น˜๋ฅผ ์ฐพ๋Š”๋‹ค. ํ˜œ์œค์ด๋Š” ๋…ธํŠธ๋ถ์˜ ์œ„์ชฝ๋ถ€ํ„ฐ ์Šคํ‹ฐ์ปค๋ฅผ ์ฑ„์›Œ ๋‚˜๊ฐ€๋ ค๊ณ  ํ•ด์„œ, ์Šคํ‹ฐ์ปค๋ฅผ ๋ถ™์ผ ์ˆ˜ ์žˆ๋Š” ์œ„์น˜๊ฐ€ ์—ฌ๋Ÿฌ ๊ณณ ์žˆ๋‹ค๋ฉด ๊ฐ€์žฅ ์œ„์ชฝ์˜ ์œ„์น˜๋ฅผ ์„ ํƒํ•œ๋‹ค. ๊ฐ€์žฅ ์œ„์ชฝ์— ํ•ด๋‹นํ•˜๋Š” ์œ„์น˜๋„ ์—ฌ๋Ÿฌ ๊ณณ์ด ์žˆ๋‹ค๋ฉด ๊ทธ์ค‘์—์„œ ๊ฐ€์žฅ ์™ผ์ชฝ์˜ ์œ„์น˜๋ฅผ ์„ ํƒํ•œ๋‹ค.
  3. ์„ ํƒํ•œ ์œ„์น˜์— ์Šคํ‹ฐ์ปค๋ฅผ ๋ถ™์ธ๋‹ค. ๋งŒ์•ฝ ์Šคํ‹ฐ์ปค๋ฅผ ๋ถ™์ผ ์ˆ˜ ์žˆ๋Š” ์œ„์น˜๊ฐ€ ์ „ํ˜€ ์—†์–ด์„œ ์Šคํ‹ฐ์ปค๋ฅผ ๋ถ™์ด์ง€ ๋ชปํ–ˆ๋‹ค๋ฉด, ์Šคํ‹ฐ์ปค๋ฅผ ์‹œ๊ณ„ ๋ฐฉํ–ฅ์œผ๋กœ 90๋„ ํšŒ์ „ํ•œ ๋’ค 2๋ฒˆ ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•œ๋‹ค.
  4. ์œ„์˜ ๊ณผ์ •์„ ๋„ค ๋ฒˆ ๋ฐ˜๋ณตํ•ด์„œ ์Šคํ‹ฐ์ปค๋ฅผ 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;
}
๋ฐ˜์‘ํ˜•