본문 바로가기
공부기록/[Algorithm]

백준 2563번 <색종이> - C++

by RiverWon 2024. 8. 6.

생각

첫 번째 자연수 : 색종이의 왼쪽 변과 도화지의 왼쪽 변 사이 거리

두 번째 자연수 : 색종이의 아래쪽 변과 도화지의 아래쪽 변 사이 거리

 

겹치는 영역을 어떻게 처리할 것인가? ▶100*100 영역이니까 색종이가 안 덮힌 부분을 빼도 되겠다

or

100*100의 0으로 채워진 배열을 만들고, 검정색 색종이를 덮은 영역만 1로 바꾸자

그럼 넓이는 행렬에서 1의 개수만 세면 된다.

1. 첫 번째 자연수부터 오른쪽 10칸을 1로

2. 두 번째 자연수부터 위로 10칸을 1로 채우자

 

정말 조심했어야 할 점이 있다. 이것때문에 자꾸 헤맸다.

두 번째 자연수가 색종이의 왼쪽 아래점을 의미한다. 그래서 아무 생각 없이 '1을 위에서부터 채워 내려오면 되겠군' 이라는 생각을 담은 루프를

for(int k=b+10; k>b; k--)

이렇게 정의해버렸다.

2차원 배열에서는 좌측상단 [0][0], 우측하단 [100][100]이기 때문에, 만약 두 번째 자연수가 90보다 컸다면면 배열 칸을 초과해서 1을 채워나가기 시작한다는 의미이다.

#include <algorithm>
#include <iostream>

using namespace std;

int main() {

  int n=0;
  int arr[100][100] = {{0,}};
  int a=0, b=0;
  int cnt=0;

  cin >> n;

  for(int i=0; i<n; i++){
    cin >> a >> b;
    for(int k=b; k<b+10; k++){
      for(int j=a; j<a+10; j++){
        arr[k][j] = 1;
      }
    }
  }

  for(int i=0;i<100;i++){
    for(int j=0;j<100;j++){
      if(arr[i][j] == 1) cnt ++;
    }
  }
  cout << cnt ;
  
  return 0;
}

주의할 점이 하나 더 있다. 문제에서 주어진 그림에는 1사분면에 도화지가 있는 형태이고 색종이를 덮는데, 2차원 배열은 전개상 4사분면에서 전개하는 것이 편하기 때문에 이중 루프의 바깥쪽 루프를

for(int k=b; k<b+10; k++)

로 정의해서 풀었다.