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

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

#include <iostream>
#include <vector>

using namespace std;

int n, m, k;
int turn;
int st_l, st_w;

struct sticker {
    int x_len, y_len;
};

void rotateSticker(vector<vector<int>>& stic) {
    int width = stic[0].size();
    int length = stic.size();
    vector<vector<int>> tmp(width, vector<int>(length));

    for (int i = 0; i < length; i++) {
        for (int j = 0; j < width; j++) {
            tmp[j][length-1-i] = stic[i][j];
        }
    }

    stic = tmp;
}

int attachSticker(vector<vector<int>> &nb, vector<vector<int>>& stic) {
    vector<vector<int>>::iterator iter;
    vector<int>::iterator it;
    int nb_l = nb.size(); int nb_w = nb[0].size();
    int stic_l = stic.size(); int stic_w = stic[0].size();

    if (nb_l >= stic_l && nb_w >= stic_w) {
        for (int start_l = 0; start_l <= nb_l - stic_l; start_l++) {
            for (int start_w = 0; start_w <= nb_w - stic_w; start_w++) {
                int tmp = 0;
                for (int i = 0; i < stic_l; i++) { // ํ˜„์žฌ ์ƒํƒœ์—์„œ ๋ถ™์—ฌ๋ณด๊ธฐ
                    for (int j = 0; j < stic_w; j++) {
                        if (nb[i + start_l][j + start_w] * stic[i][j]) { // ์•ˆ ๋ถ™์œผ๋ฉด ๋‹ค์Œ ์œ„์น˜ ์กฐ์‚ฌ
                            tmp = 1;
                            break;
                        }
                    }
                    if (tmp) {
                        break;
                    }
                }
                if (!(tmp)) { // ๋ถ™์—ˆ์œผ๋ฉด
                    for (int i = 0; i < stic_l; i++) {
                        for (int j = 0; j < stic_w; j++) {
                            nb[i + start_l][j + start_w] += stic[i][j];
                        }
                    }
                    return 1;
                }
            }
        }
    }
    if (turn--) { // ์•„์ง 3๋ฒˆ์„ ์•ˆ ๋Œ์•˜์œผ๋ฉด
        rotateSticker(stic);
        if (attachSticker(nb, stic)) { // ๋Œ๋ฆฌ๊ณ  ๋‹ค์‹œ ์‹œ๋„
            return 1;
        }
        else {
            return -1; // ๋ถ™์ผ ์ˆ˜ ์—†์Œ
        }
    }
    else { // ๋ถ™์ผ ์ˆ˜ ์—†์Œ
        return -1;
    }

    return 1;
}

int remainBlock(vector<vector<int>> obj) {
    int obj_l = obj.size(); int obj_w = obj[0].size();
    int sum = 0;
    for (int i = 0; i < obj_l; i++) {
        for (int j = 0; j < obj_w; j++) {
            if (obj[i][j] != 0) {
                sum++;
            }
        }
    }
    return sum;
}

void printArr(vector<vector<int>> obj) {
    int obj_l = obj.size(); int obj_w = obj[0].size();
    for (int i = 0; i < obj_l; i++) {
        for (int j = 0; j < obj_w; j++) {
            cout << obj[i][j] << " ";
        }
        cout << endl;
    }
}

int main() {
    cin >> n >> m >> k;
    vector<vector<int>> notebook(n, vector<int>(m));
    vector<sticker> stickers(k);

    vector<vector<int>>::iterator iter;
    vector<int>::iterator it;

    for (int i = 0; i < k; i++) { // sticker๋ฅผ ํ•˜๋‚˜์”ฉ ๋ฐ›์œผ๋ฉด์„œ
        cin >> stickers[i].y_len >> stickers[i].x_len;
        int x_len = stickers[i].x_len;
        int y_len = stickers[i].y_len;

        vector<vector<int>> one_sticker(y_len, vector<int>(x_len));
        for (int j = 0; j < stickers[i].y_len; j++) {
            for (int k = 0; k < stickers[i].x_len; k++) {
                cin >> one_sticker[j][k];
            }
        }
        turn = 3;

        attachSticker(notebook, one_sticker);
        printArr(notebook);

    }
    cout << remainBlock(notebook);
}

์•„์ง ์ฝ”๋“œ๋ฅผ ๋ณด๊ธฐ ์ข‹๊ฒŒ, ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์งœ๋Š” ์—ฐ์Šต์ด ๋œ ๋œ ๋“ฏํ•˜๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ตฌํ˜„ํ•˜๋Š”๋ฐ ์†Œ์š”๋œ ์‹œ๊ฐ„์ด ์•ฝ 2์‹œ๊ฐ„ ์ •๋„์ธ ๊ฒƒ์œผ๋กœ ๋ณด์•„ ์•„์ง ๊ตฌํ˜„์ด ๋Š๋ฆฌ๋‹ค.

 

 

4์ค‘ FOR๋ฌธ์„ ๋Œ๋ฉด์„œ ์Šคํ‹ฐ์ปค๊ฐ€ ๋ถ€์ฐฉ๋˜๋Š” ์ง€ ํ™•์ธํ•˜์˜€๊ณ , ์Šคํ‹ฐ์ปค ๋ถ€์ฐฉ์ด ์•ˆ๋˜๋Š” ๊ฒฝ์šฐ ์ตœ๋Œ€ 4๋ฒˆ๊นŒ์ง€ ํ•ด๋‹น ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜์—ฌ์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— 4*N(๋…ธํŠธ๋ถ ํ–‰)*M(๋…ธํŠธ๋ถ ์—ด)*R(์Šคํ‹ฐ์ปค ํ–‰)*C(์Šคํ‹ฐ์ปค ์—ด)์˜ ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ ๋‚˜์˜จ๋‹ค. ๋˜ํ•œ ์ด๋Ÿฌํ•œ ๊ณผ์ •์„ ์Šคํ‹ฐ์ปค๋งˆ๋‹ค ์‹คํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— K๋ฒˆ ์ด ๊ณผ์ •์„ ์‹คํ–‰ํ•˜๊ฒŒ ๋œ๋‹ค.

 

๋”ฐ๋ผ์„œ ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” 4KNMRC์ด๋ฏ€๋กœ ์ฃผ์–ด์ง„ ์ž…๋ ฅ์˜ ๋ฒ”์œ„์— ๋”ฐ๋ผ ์ตœ๋Œ€ 1.6*10^(7) ์ด ๋˜์–ด ์‹œ๊ฐ„์ด ๋ถ€์กฑํ•  ์ผ์€ ์—†๋‹ค :> ์‹ฌ์ง€์–ด ์ด ๋ฌธ์ œ์˜ ์‹œ๊ฐ„ ์ œํ•œ์€ 2์ดˆ์ด๊ณ  ๋ฉ”๋ชจ๋ฆฌ๋„ 512MB๋กœ ๋„‰๋„‰ํ•˜๊ฒŒ ์ฃผ์–ด์กŒ๋‹ค.

 

 

 

๊นจ๋‹ฌ์€ ๊ฒƒ

์ฐธ๊ณ  : https://blog.encrypted.gg/938?category=730176

์ •๋‹ต ์ฝ”๋“œ๋ฅผ ๋ณด๊ณ  ๋ฐœ์ „์‹œํ‚ฌ ์ ์„ ์ ์–ด๋ณด์•˜๋‹ค.

 

  1. cin, cout, endl ์€ ์ƒ๊ฐ๋ณด๋‹ค ๋Š๋ฆฌ๋‹ค.

cin, cout๋ณด๋‹ค scanf, printf๋ฅผ ์“ฐ๋Š” ๊ฒƒ์ด ๋‚ซ๊ณ , cin, cout์„ ์“ฐ๋ ค๋ฉด

ios_base :: sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);

์ด๋ ‡๊ฒŒ ๊ฐ€์†ํ™”์‹œํ‚ฌ ์ˆ˜๋Š” ์žˆ์œผ๋‚˜ ๊ทธ๋ž˜๋„ ๋” ๋Š๋ฆฌ๋‹ค. ๋˜ํ•œ sync_with_stdio๋กœ ๋„˜๊ฒจ์ฃผ๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜ ๊ฐ’์ด false๊ฐ€ ๋˜๋ฉด thread unsafe(์“ฐ๋ ˆ๋“œ์˜ ์ˆœ์„œ๋ฅผ ์˜ˆ์ธกํ•  ์ˆ˜ ์—†์Œ)ํ•ด์ง€๊ธฐ ๋•Œ๋ฌธ์— ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๊ฐ’์ด ๋‚˜์˜ฌ ์ˆ˜๋„ ์žˆ์œผ๋ฏ€๋กœ ์“ฐ์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

c ํ‘œ์ค€ ์ž…์ถœ๋ ฅํ•จ์ˆ˜๋ฅผ ์“ฐ์ž.

์‹œ๊ฐ„์„ ๋” ๋‹จ์ถ•์‹œํ‚ค๊ณ  ์‹ถ๋‹ค๋ฉด ๊ธ€์ž ํ•˜๋‚˜์”ฉ ์ž…์ถœ๋ ฅํ•˜๋Š” getchar, putchar ๋“ฑ์ด ๋” ๋น ๋ฅด๋‹ค.

์ฐธ๊ณ : https://eine.tistory.com/entry/CC-%EC%9E%85%EC%B6%9C%EB%A0%A5-%EB%B0%A9%EB%B2%95%EC%97%90-%EB%94%B0%EB%A5%B8-%EC%86%8D%EB%8F%84-%EC%A0%95%EB%A6%AC

 

  1. ๋…ธํŠธ๋ถ์˜ ํฌ๊ธฐ๊ฐ€ ์ตœ๋Œ€ 40์ด๊ณ  ์Šคํ‹ฐ์ปค ํฌ๊ธฐ๊ฐ€ ์ตœ๋Œ€ 10์œผ๋กœ ์ž‘๋‹ค.

๊ตณ์ด vector ๊ตฌ์กฐ์ฒด๋ฅผ ์•ˆ์“ฐ๊ณ  int ๋ฐฐ์—ด์„ max size๋กœ ์žก์•„์„œ ์‚ฌ์šฉํ•ด๋„ ๋œ๋‹ค.

 

  1. ์Šคํ‹ฐ์ปค๊ฐ€ ๋ถ™์€ ๋ธ”๋ก์˜ ๊ฐฏ์ˆ˜ ํ™•์ธ

    ๊ฐฏ์ˆ˜๋ฅผ ํ™•์ธํ•  ๋•Œ ๋ณธ์ธ์€ if๋ฌธ์œผ๋กœ ๋…ธํŠธ๋ถ์˜ ํ•ด๋‹น ์นธ์ด 1์ธ์ง€ ํŒ๋‹จํ•˜์˜€์œผ๋‚˜, ๊ทธ๋ƒฅ sum์— ๋ชจ๋“  ๋…ธํŠธ๋ถ ์นธ์˜ ๊ฐ’์„ ๋”ํ•ด์ฃผ๋ฉด ๋˜๋Š” ์ผ์ด์—ˆ๋‹ค. ์“ธ๋ฐ์—†์ด ๋น„๊ตํ•จ์ˆ˜๋ฅผ ํ•˜๋‚˜ ๋” ์‚ฌ์šฉํ•˜์˜€๋‹ค.

๋ฐ˜์‘ํ˜•