문제 링크
접근
최대한 문제에서 제시한 대로 구현하려고 노력했다. 그러나 답은 맞았지만 머릿속에서 꼬여버린 탓에 코드를 덕지덕지 짠 것 같다. 그래서 시간복잡도가 그렇게 좋지 못한 결과가 나왔다.
그래서 바킹독님 블로그에 제시된 간결한 코드로 다시 복습해 보려 한다. 앞으로는 먼저 계획을 세우고 코드를 짜는 습관을 길러야겠다.
알고리즘
- 노트북에 스티커를 붙일 수 있는지 확인한다.
- 만약, 스티커를 붙일 수 있다면 스티커를 붙인다.
- 만약, 스티커를 붙일 수 없다면 스티커를 회전한다.
- 모든 방향으로 회전하여도 스티커를 붙일 수 없다면 그 스티커를 버린다.
- 이를 스티커를 다 쓸 때까지 반복한다.
코드
#include <iostream>
using namespace std;
int n, m, k;
int note[42][42];
int r, c;
int paper[12][12];
// paper를 90도 회전하는 함수
void rotate()
{
int tmp[12][12];
for (int i = 0; i < r; i++)
{
for (int j = 0; j < c; j++)
{
tmp[i][j] = paper[i][j];
}
}
for (int i = 0; i < c; i++)
{
for (int j = 0; j < r; j++)
{
paper[i][j] = tmp[r - 1 - j][i];
}
}
swap(r, c);
}
// note의 (x, y)에 모눈종이의 (0, 0)이 올라가게 스티커를 붙일 수 있는지 판단하는 함수
// 가능할 경우 note를 갱신한 후 true를 반환한다.
bool pastable(int x, int y)
{
for (int i = 0; i < r; i++)
{
for (int j = 0; j < c; j++)
{
if (note[x + i][y + j] == 1 && paper[i][j] == 1)
return false;
}
}
for (int i = 0; i < r; i++)
{
for (int j = 0; j < c; j++)
{
if (paper[i][j] == 1)
note[x + i][y + j] = 1;
}
}
return true;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> n >> m >> k;
while (k--)
{
cin >> r >> c;
for (int i = 0; i < r; i++)
{
for (int j = 0; j < c; j++)
{
cin >> paper[i][j];
}
}
for (int rot = 0; rot < 4; rot++)
{
bool is_paste = false;
for (int x = 0; x <= n - r; x++)
{
if (is_paste) break;
for (int y = 0; y <= m - c; y++)
{
if (pastable(x, y))
{
is_paste = true;
break;
}
}
}
if (is_paste) break;
rotate();
}
}
int cnt = 0;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
cnt += note[i][j];
}
}
cout << cnt;
}
보충 - Rotate에 대한 이해
내가 짠 코드에서는(부끄러워 보여 줄 수가 없다...) Rotate를 아주 복잡하게 처리하였다.
Rotate를 하는 부분이 익숙하지 않아 헷갈렸다.
위 그림과 같이 회전한 배열의 모양에 신경 쓰기 보단, 수에서 규칙을 찾아내는 것이 쉬운 방법이다.
밑 코드는 그것을 그대로 구현한 모습.
// paper를 90도 회전하는 함수
void rotate()
{
int tmp[12][12];
for (int i = 0; i < r; i++)
{
for (int j = 0; j < c; j++)
{
tmp[i][j] = paper[i][j];
}
}
for (int i = 0; i < c; i++)
{
for (int j = 0; j < r; j++)
{
paper[i][j] = tmp[r - 1 - j][i];
}
}
swap(r, c);
}
결과
제일 밑 코드가 내가 직접 짠 코드인데 처참한 것을 볼 수 있다. 핳
'알고리즘' 카테고리의 다른 글
[C++] Boj 15683 감시 (0) | 2025.02.20 |
---|---|
[C++] Boj 16987 계란으로 계란치기 (0) | 2025.02.17 |
[C++] Boj 1941 소문난 칠공주 (1) | 2025.02.16 |
[C++] Boj 1759 암호 만들기 (1) | 2025.02.07 |
[C++] Boj 15666 N과 M (12) (0) | 2025.02.06 |