# 문제
이러한 방식으로 색종이를 한 장 또는 여러 장 붙인 후 색종이가 붙은 검은 영역의 넓이를 구하는 프로그램을 작성하시오.

# 풀이
풀이를 떠올릴 때 지금 우리가 어느 단계에 위치해있는지를 떠올리는 게 굉장한 도움이 된다.
아직 단계별 풀이를 벗어나지 못한 우리에게 도움이 되는(?) 아주 약간의 힌트!
정답 소스코드를 보며 답을 확인해보자.
#include <iostream> using namespace std; int main(){ ios_base::sync_with_stdio(false); // 두 표준 입출력 동기화 해제 bool paper[100][100] = {0}; int sum = 0; int n; cin >> n; while(n--){ int x, y; cin >> x >> y; for(int i=y; i < y+10; i++){ for(int j=x; j < x+10; j++){ if(paper[i][j]) continue; paper[i][j] = 1; sum++; } } } cout << sum; return 0; }
색종이를 붙일 도화지의 크기가 100*100으로 주어졌으므로 같은 크기의 bool타입 배열을 만들어준다.
그리고 색종이를 붙인다기보다 색칠을 한다고 생각하면 편하기 때문에 우선은 백지상태인 false로 배열을 초기화한다.

색칠은, 예를 들어 입력된 색종이를 붙인 위치가 1 1인 경우 색종이의 크기 또한 10*10으로 고정되어 있기 때문에
paper[1][1] ~ paper[1][10]
paper[2][1] ~ paper[2][10]
paper[3][1] ~ paper[3][10]
paper[4][1] ~ paper[4][10]
paper[5][1] ~ paper[5][10]
paper[6][1] ~ paper[6][10]
paper[7][1] ~ paper[7][10]
paper[8][1] ~ paper[8][10]
paper[9][1] ~ paper[9][10]
paper[10][1] ~ paper[10][10]
다음과 같이 배열을 채워주면 위의 네모와 같이 보인다고 생각하면 된다.
해당 인덱스에 대해 for문을 돌며 해당 배열값은 모두 true로 변경하며 색칠!
while(n--){ int x, y; cin >> x >> y; for(int i=y; i < y+10; i++){ for(int j=x; j < x+10; j++){ if(paper[i][j]) continue; paper[i][j] = 1; sum++; } } }
입력된 색종이의 개수만큼 해당 작업을 반복하고 (while)
만약 도화지가 이미 색칠되어 있을 경우(paper[i][j]가 true)에는 continue로 불필요한 반복을 건너뛴다.
색칠이 안 된 경우에만 색칠을 하고(paper[i][j] = true) 해당 칸을 세어주면 문제에서 요구한 검은 영역의 넓이 계산 끝!

2563번: 색종이
가로, 세로의 크기가 각각 100인 정사각형 모양의 흰색 도화지가 있다. 이 도화지 위에 가로, 세로의 크기가 각각 10인 정사각형 모양의 검은색 색종이를 색종이의 변과 도화지의 변이 평행하도록
www.acmicpc.net
'백준 > C++' 카테고리의 다른 글
[백준] 11005번: 진법 변환 2 | C++ 풀이 (0) | 2023.05.30 |
---|---|
[백준] 2745번: 진법 변환 | C++ 풀이 (0) | 2023.05.29 |
[백준] 10798번: 세로 읽기 | C++ 풀이 (0) | 2023.05.27 |
[백준] 25206번: 너의 평점은 | C++ 풀이 (0) | 2023.05.26 |
[백준] 1316번: 그룹 단어 체커 | C++ 풀이 (0) | 2023.05.25 |