본문 바로가기
알고리즘/BOJ

BOJ 18808) 스티커 붙이기 (C++)

by twinkite 2021. 10. 4.
반응형
 

18808번: 스티커 붙이기

혜윤이는 최근에 다양한 대회를 참여하면서 노트북에 붙일 수 있는 스티커들을 많이 받았다. 스티커는 아래와 같이 사각 모눈종이 위에 인쇄되어 있으며, 스티커의 각 칸은 상하좌우로 모두 연

www.acmicpc.net

 구현 문제이다. 처음엔 돌리는걸 직접 구현하지 않고 노트북에 스티커를 붙여보는 단계에서 i, j를 조절해서 해결하려 하였으나 생각보다 신경쓸 부분이 많아서 스티커를 돌리는걸로 변경했다. 스티커를 돌리는 부분에서 i, j가 헷갈려서 또 한참 헤맸다. 

 각 스티커에 대해 붙일 수 있는지 검토한다(stick). 붙일 수 있는 공간이 있으면 붙이고 다음 스티커의 검토로 넘어가고 그렇지 않으면 스티커를 회전시켜 다시 시도한다. 스티커를 회전시킬 때 i, j가 어떤식으로 바뀌어야 하는지 주의한다. 스티커를 회전시키고 나면 가로 세로 길이도 바꿔준다. 90 180, 270도 회전을 한 뒤에도 붙이지 못하면 다음 스티커로 넘어간다. 

 스티커를 붙일 수 있는 공간을 찾으면 빈칸에 스티커를 붙이고 붙은 영역의 갯수(ans)를 1 증가시킨다.

#include <bits/stdc++.h>
using namespace std;

int N, M, K, r, c, ans, cnt;
bool laptop[41][41];
bool sticker[11][11];
bool temp[11][11];

void rotate(){
  memset(temp, 0, sizeof(temp));
  for(int i=0;i<c; i++){
    for(int j=0;j<r;j++){
      temp[i][j]=sticker[r-1-j][i];
    }
  }
  memset(sticker, 0, sizeof(sticker));
   for(int i=0;i<c; i++){
    for(int j=0;j<r;j++){
      sticker[i][j]=temp[i][j];
    }
  }
  int temp =r;
  r=c;
  c=temp;
}

bool stick(int x, int y){
  for(int i=0;i<r;i++){
    for(int j=0;j<c;j++){
      if(laptop[x+i][y+j]==1&&sticker[i][j]==1) return false;
    }
  }
  for(int i=0;i<r;i++){
    for(int j=0;j<c;j++){
      if(!laptop[x+i][y+j]&&sticker[i][j]) {
        laptop[x+i][y+j]=1;
        ans++;
      }
    }
  }
  return true;
}

void start(){
  int i=0,j=0,k=0;
  bool chk = false;
  while(!chk&&k<4){
    i=0;j=0;
    while(!chk&&(i<=N-r&&j<=M-c)){
      chk = stick(i,j);
      if(j==M-c){
        i+=1; j=0;
      } else {
        j++;
      }
    }
    if(!chk) rotate();
    k++;
  }
}

int main(){
  ios_base::sync_with_stdio(0);
  cin.tie(0);

  cin>>N>>M>>K;
  for(int i=0;i<K;i++){
    cin>>r>>c;
    cnt=0;
    memset(sticker, 0, sizeof(sticker));
    for(int j=0;j<r;j++){
      for(int k=0;k<c;k++){
        cin>>sticker[j][k];
        if(sticker[j][k]) cnt++;
      }
    }
    start();
  }
 

  cout<<ans;
  return 0;
}
반응형

'알고리즘 > BOJ' 카테고리의 다른 글

BOJ 11652) 카드 (C++)  (0) 2022.03.12
BOJ 12100) 2048(Easy) (C++)  (0) 2021.10.05
BOJ 15683) 감시 (C++)  (0) 2021.09.26
BOJ 16987) 계란으로 계란치기 (C++)  (0) 2021.09.24
BOJ 1941) 소문난 칠공주 (C++)  (0) 2021.09.23