2563번: 색종이
가로, 세로의 크기가 각각 100인 정사각형 모양의 흰색 도화지가 있다. 이 도화지 위에 가로, 세로의 크기가 각각 10인 정사각형 모양의 검은색 색종이를 색종이의 변과 도화지의 변이 평행하도록
www.acmicpc.net
문제
가로, 세로의 크기가 각각 100인 정사각형 모양의 흰색 도화지가 있다. 이 도화지 위에 가로, 세로의 크기가 각각 10인 정사각형 모양의 검은색 색종이를 색종이의 변과 도화지의 변이 평행하도록 붙인다. 이러한 방식으로 색종이를 한 장 또는 여러 장 붙인 후 색종이가 붙은 검은 영역의 넓이를 구하는 프로그램을 작성하시오.
![](https://blog.kakaocdn.net/dn/wKcbO/btrQvNwgvL0/fxKOeFkfbxaHhsuDvpwW81/img.jpg)
예를 들어 흰색 도화지 위에 세 장의 검은색 색종이를 그림과 같은 모양으로 붙였다면 검은색 영역의 넓이는 260이 된다.
입력
첫째 줄에 색종이의 수가 주어진다. 이어 둘째 줄부터 한 줄에 하나씩 색종이를 붙인 위치가 주어진다. 색종이를 붙인 위치는 두 개의 자연수로 주어지는데 첫 번째 자연수는 색종이의 왼쪽 변과 도화지의 왼쪽 변 사이의 거리이고, 두 번째 자연수는 색종이의 아래쪽 변과 도화지의 아래쪽 변 사이의 거리이다. 색종이의 수는 100 이하이며, 색종이가 도화지 밖으로 나가는 경우는 없다
출력
첫째 줄에 색종이가 붙은 검은 영역의 넓이를 출력한다.
예제 입력 1
3
3 7
15 7
5 2
예제 출력 1
260
해결 아이디어
2차원 boolean 배열을 100x100크기로 선언한 후, n만큼 반복하여 row, col값에 10x10의 크기만큼 배열값을 true로 바꿔주며 area를 1씩 증가시킨다, 이미 area가 true인경우는, 이전에 색종이를 덮어 이미 채워진 공간이기에 넘어가며, false인 경우에만 true 및 area를 1씩 증가시키도록 만들었다.
#include <iostream>
using namespace std;
int main()
{
bool mat[100][100] = {0, };
int n, row, col, area = 0;
cin >> n;
for (int i = 0; i < n; ++i)
{
cin >> row >> col;
for (int j = row; j < row + 10; ++j)
{
for (int k = col; k < col + 10; ++k)
{
if (!mat[j][k])
{
mat[j][k] = 1;
++area;
}
}
}
}
cout << area;
}
개선 사항
본 문제는 2차원 배열 배열을 선언과 동시에 모두 false로 하기위해 bool mat[100][100] = {0, };라고 코드를 작성하였는데, 이것을 질문한 결과 잘못된 방법이라고 알려주셔서 배열은 선언후 for문으로 안전하고, 확실하게 초기화하는것이 적합하다고 배웠다.
글 읽기 - C++ 배열 선언 및 값 초기화
댓글을 작성하려면 로그인해야 합니다.
www.acmicpc.net
'algorithms (C++)' 카테고리의 다른 글
[C++] 백준 2587번 / 대표값2 (0) | 2022.11.08 |
---|---|
[C++] 백준 2750번 / 수 정렬하기 (0) | 2022.11.08 |
[C++] 백준 2566번 / 최댓값 (0) | 2022.11.07 |
[C++] 백준 2738번 / 행렬 덧셈 (0) | 2022.11.07 |
[C++] 백준 17478번 / 재귀함수가 뭔가요? (0) | 2022.08.20 |