본문 바로가기
알고리즘/백준

백준 2563번 색종이 [C++]

by seongjun 2023. 11. 25.

https://www.acmicpc.net/problem/2563

 

2563번: 색종이

첫째 줄에 색종이의 수가 주어진다. 이어 둘째 줄부터 한 줄에 하나씩 색종이를 붙인 위치가 주어진다. 색종이를 붙인 위치는 두 개의 자연수로 주어지는데 첫 번째 자연수는 색종이의 왼쪽 변

www.acmicpc.net

 

 

넓이가 각각 100인 색종이 n개가 주어질 때, 겹치는 부분을 제외한 총 넓이를 출력하면 된다.

 

#include <iostream>
#include <string>

using namespace std;
//4. int arr[100][100]; -> 통과 됨.
int main(){
    int n;
    cin >> n;
    int answer = 0;
    
    // 1. int arr[100][100]; -> 통과 안됨!!
    int arr[100][100] = {0,}; // 2. -> 통과 됨.
    // 3. int arr[101][101]; -> 통과 됨.
    
    for (int i=0;i<n;i++){
        int x, y;
        cin >> x >> y;
        for (int j=x;j<x+10;j++){
            for (int k=y;k<y+10;k++){
                if (arr[j][k] != 1){
                    arr[j][k] = 1;
                    answer += 1;
                }
            }
        }
    }
    cout << answer;

}

일단, 문제에서 주어진 도화지 크기만큼의 배열을 선언 후, 각 인덱스를 순회하며 이미 색종이가 덮인 부분이면 넘어가고, 색종이가 덮이지 않은 부분이면 넓이에 1을 더해주는 방식으로 해결.

하지만, int arr[100][100]; 처음엔 main 함수 내에 선언했더니 통과가 되지 않았지만, 전역 변수로 선언하니 통과가 되었다. 이유를 찾아보니 전역변수는 초기화 하지 않아도 0으로 초기화 된다고 해서 납득했지만, 문제는 그 다음이었다.

 

int arr[101][101];을 main 내에 선언했는데 통과가 되었다. 여기서 의문이 발생하게 된다.

쓰레기 값이 들어갔기 때문에 통과가 안됐는데, 왜 배열의 크기를 한칸 늘려주면 통과가 되는 걸까? 만약 크기 문제였다면 전역변수 또한 100 x 100으로 선언했을 때 통과가 안되어야 하는거 아닌가?

해당 의문은 아직 미해결 중.