# 문제
이러한 방식으로 색종이를 한 장 또는 여러 장 붙인 후 색종이가 붙은 검은 영역의 넓이를 구하는 프로그램을 작성하시오.
# 풀이
풀이를 떠올릴 때 지금 우리가 어느 단계에 위치해있는지를 떠올리는 게 굉장한 도움이 된다.
아직 단계별 풀이를 벗어나지 못한 우리에게 도움이 되는(?) 아주 약간의 힌트!
정답 소스코드를 보며 답을 확인해보자.
#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) 해당 칸을 세어주면 문제에서 요구한 검은 영역의 넓이 계산 끝!
'백준 > 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 |