백준/C++

[백준] 2563번: 색종이 | C++ 풀이

성실한 당근농부 2023. 5. 28. 14:24

# 문제

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

 


 

# 풀이

풀이를 떠올릴 때 지금 우리가 어느 단계에 위치해있는지를 떠올리는 게 굉장한 도움이 된다.

아직 단계별 풀이를 벗어나지 못한 우리에게 도움이 되는(?) 아주 약간의 힌트!

정답 소스코드를 보며 답을 확인해보자.

 

#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

 

728x90