본문 바로가기

BaekJoon

2 Dimentional array - 2563 C++

문제


백준 2563번

관련문제 (2669번)

가로, 세로의 크기가 각각 100인 정사각형 모양의 흰색 도화지가 있다.

이 도화지 위에 가로, 세로의 크기가 각각 10인 정사각형 모양의 검은색 색종이를 색종이의 변과 도화지의 변이 평행하도록 붙인다.

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

 

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

 

2563번: 색종이

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

www.acmicpc.net

 

개요


기본적으로 좌표가 나오고 좌표의 특정한 점을 찍어주며 면적을 계산하는 문제이다.

코드를 짜기에는 쉬우나 해결과정을 처음부터 생각하기에는 조금 난해한 문제라고 할 수 있다. (적어도 필자에게는 그렇게 느껴졌다...)

소수점이 들어있는게 아니므로 단순하게 좌표의 모든 점을 2차원 배열 구조로 나타내어 구해야하는 면적 부분만 따로 flag를 두어

그 flag의 개수를 센다면 편하게 구할 수 있을 것이다.

 

 

 

과정


앞서 말한 것 처럼 좌표의 모든 점을 2차원 배열로 나타내어 줄 것이다.

이 경우 편의성을 위해 배열의 크기를 100이 아닌 101로 만들어 주어 점을 바로 바로 대입할 수 있게 해주겠다.

그 다음 점이 주어지는데 색종이의 크기는 10으로 고정이므로 각 점에서부터 100개의 점에 flag를 true로 세워주면 된다.

(이 경우 따로 겹치는 부분은 처리를 해 줄 필요가 없다.)

마지막으로 모든 점을 돌면서 true의 개수를 세어주면 결과가 나오게 된다.

 

 

코드


#include<iostream>
using namespace std;

int main(){
    int n, x, y;
    bool matrix[101][101] = {false}; //배열의 모든 값을 false로 초기화

    cin >>n;
    for(int i=0; i< n; i++){
        cin >> x>> y;

        for(int k=0; k<10; k++){
            for(int p=0;p<10;p++){
                matrix[x+k][y+p] = true; //각 점에서부터 100개의 점을 모두 true로
            }
        }
    }

    int sum = 0;
    for(int i=1; i<101; i++){
        for(int k=1; k<101; k++){
            if(matrix[i][k] == true){
                sum+=1; //각 점을 돌며 true 개수 세기
            }
        } 
    }
    cout<< sum;
}

문제 푸는 방식만 알고나면 굉장히 간단한 문제라고 할 수 있다.

 

'BaekJoon' 카테고리의 다른 글

Graph [Adjacency List] - 4803 C++  (0) 2023.08.10
Graph (DFS,BFS)(basic) - 1260 C++  (0) 2023.08.06
Brute Force -10881 C++  (0) 2023.08.02
Brute Force, Greedy - 2590 C++  (0) 2023.08.02
Merge Sort (build) - 2751 C++  (0) 2023.07.08