본문 바로가기

Algorithm/Implementation

(C++) - 백준(BOJ) 18808번 : 스티커 붙이기

반응형

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

 

18808번: 스티커 붙이기

혜윤이는 최근에 다양한 대회를 참여하면서 노트북에 붙일 수 있는 스티커들을 많이 받았다. 스티커는 아래와 같이 사각 모눈종이 위에 인쇄되어 있으며, 스티커의 각 칸은 상하좌우로 모두 연결되어 있다. 또한 모눈종이의 크기는 스티커의 크기에 꼭 맞아서, 상하좌우에 스티커가 포함되지 않는 불필요한 행이나 열이 존재하지 않는다. 아래는 올바른 모눈종이의 예시이다. 주황색 칸은 스티커가 붙은 칸을, 하얀색 칸은 스티커가 붙지 않은 칸을 나타낸다. 반면 아래는 올바

www.acmicpc.net

코테 모의고사 문제입니다.

1.풀이방법 : 착하게 문제에서 하라는 대로 하시면 됩니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
#include <iostream>
#include <algorithm>
#include <vector>
#include <cstring>
using namespace std;
 
//노트북의 행,열, 스티커 개수
int n, m, k;
//스티커의 행,열
int r, c;
 
int sticker[11][11];
int laptop[41][41];
 
 
//90도 우측으로 회전
void rotate(int sticker[11][11]) {
    int tmp[11][11];
    memset(tmp, 0sizeof(tmp));
 
    for (int i = 1; i <= c; i++) {
        for (int j = 1; j <= r; j++) {
            tmp[i][j] = sticker[r - j + 1][i];
        }
    }
    memset(sticker, 0sizeof(sticker));
 
    for (int i = 1; i <= c; i++) {
        for (int j = 1; j <= r; j++) {
            sticker[i][j] = tmp[i][j];
        }
    }
    swap(r, c);
}
 
 
//붙일수 있는가?
bool check(int laptop[41][41], int x, int y) {
    int tmp[41][41];
    memset(tmp, 0sizeof(tmp));
    int flag = 0;
 
    //노트북 상태 tmp배열에 복사
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= m; j++) {
            tmp[i][j] = laptop[i][j];
        }
    }
 
    for (int row = 1; row <= r; row++) {
        for (int col = 1; col <= c; col++) {
 
            //붙이려는 곳에 이미 칸이 차있거나 노트북 크기에서 벗어나면 return 0.
            if ((laptop[row + x - 1][col + y - 1&& sticker[row][col]) || ( row + x - 1 > n || col + y - 1 > m )) { return 0; }
 
            //노트북이 0이고 스티커가 1인 것만 붙임
            else if (laptop[row + x - 1][col + y - 1== 0 && sticker[row][col])
                tmp[x + row - 1][y + col - 1= sticker[row][col];
        }
    }
 
    for (int row = 1; row <= n; row++) {
        for (int col = 1; col <= m; col++) {
            laptop[row][col] = tmp[row][col];
        }
    }
    
    return 1;
}
 
 
int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
 
    int ans = 0;
 
    cin >> n >> m >> k;
    for (int i = 0; i < k; i++) {
 
        memset(sticker, 0sizeof(sticker));
        cin >> r >> c;
        for (int row = 1; row <= r; row++) {
            for (int col = 1; col <= c; col++) {
                cin >> sticker[row][col];
            }
        }
 
        int f = 0;
        for (int k = 0; k < 4; k++) {
            for (int i = 1; i <= n; i++) {
                for (int j = 1; j <= m; j++) {
                    if (check(laptop, i, j)) {
                        f = 1;
                        break;
                    }
                }
                if (f) break;
            }
            if (f) break;
            rotate(sticker);
        }
 
    }
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= m; j++) {
            if (laptop[i][j])
                ans++;
        }
    }
    cout << ans << '\n';
}
cs