티스토리 뷰

알고리즘/백준

[백준] 10163번 색종이

JeongHyeon 2017. 11. 28. 14:13

문제

출처 : https://www.acmicpc.net/problem/10163

시간 제한메모리 제한제출정답맞은 사람정답 비율
1 초64 MB143078267855.483%

문제

평면에 색깔이 서로 다른 직사각형 모양의 색종이 N장이 하나씩 차례로 놓여진다. 이 때 색종이가 비스듬하게 놓이는 경우는 없다. 즉, 모든 색종이의 변은 서로 평행하거나, 서로 수직이거나 둘 중 하나이다. 그림-1은 1번, 2번, 3번 세 장의 색종이가 순서대로 놓인 상태를 보여준다.

그림-1

여기에 그림-2에서 보인 것처럼 4번 색종이가 하나 더 놓이면 3번 색종이는 완전히 가려서 보이지 않게 된다. 그리고, 1번 색종이와 2번 색종이는 부분적으로 가려 보이며, 4번 색종이는 완전히 보이게 된다.

그림-2

N장의 색종이가 주어진 위치에 차례로 놓일 경우, 각 색종이가 보이는 부분의 면적을 구하는 프로그램을 작성하시오. 

입력

입력의 첫 번째 줄에는 색종이의 장수를 나타내는 정수 N (1 ≤ N ≤ 100)이 주어진다. 이어서 N장의 색종이에 관한 입력이 각 색종이마다 한 줄씩 차례로 주어진다. 색종이가 놓이는 평면은 가로 최대 101칸, 세로 최대 101칸으로 구성된 격자 모양이다. 격자의 각 칸은 가로, 세로 길이가 1인 면적이 1인 정사각형이다. 

편의상 가로 6칸, 세로 6칸으로 이루어진 격자의 예를 들어 설명하면, 각 칸에 표시된 값 (a,b)는 해당 칸의 번호를 나타낸다. 가장 왼쪽 아래의 칸은 (0,0) 가장 오른 쪽 위의 칸은 (5,5)이다. 

색종이가 놓인 상태는 가장 왼쪽 아래 칸의 번호와 너비, 높이를 나타내는 네 정수로 표현한다. 예를 들어, 위 그림에서 회색으로 표시된 색종이는 (1,4)가 가장 왼쪽 아래에 있고 너비 3, 높이 2이므로 1 4 3 2로 표현한다. 색종이가 격자 경계 밖으로 나가는 경우는 없다. 

출력

입력에서 주어진 순서에 따라 N장의 색종이를 평면에 놓았을 때, 입력에서 주어진 순서대로 각 색종이가 보이는 부분의 면적을 한 줄에 하나씩 하나의 정수로 출력한다. 만약 색종이가 보이지 않는다면 정수 0을 출력한다. 

예제 입력 

2
0 0 10 10
2 2 6 6

예제 출력 

64
36



풀이과정



풀이과정

먼저 101*101 크기의 벡터를 만들고 N번째 색종이 번호를 색종이가 위치한 곳 원소에 넣고 마지막에 색종이들의 번호가 몇개 있는지 확인해서 면적을 출력하는 방식을 생각했고 맞았다.

소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include <iostream>
#include <vector>
 
using namespace std;
 
vector<vector<int>> paper(101,vector<int>(101,-1));
 
 
int main()
{
    int N,col,row,width,height;
    int cnt = 0;
 
    cin >> N; // 색종이의 갯수
 
    vector<int> ans(N,0); // 색종이 넓이 벡터 
 
    while (cnt<N)
    {
        cin >> col >> row >> width >> height;
        for (int i = col; i < col+width; i++)
        {
            for (int j = row ;j < row+height; j++)
            {
                paper[i][j] = cnt; // 색종이 번호로 초기화
            }
        }
        cnt++;
    }
    
    for (int chk = 0; chk < N; chk++)
    {
        for (int i = 0; i < paper.size(); i++)
        {
            for (int j = 0; j < paper[i].size(); j++)
            {
                if (paper[i][j] == chk)
                    ans[chk]++;
            }
        }
    }
 
    for (int i = 0; i < ans.size(); i++cout << ans[i] << endl;
 
    return 0;
}
cs



'알고리즘 > 백준' 카테고리의 다른 글

[백준] 9095번 1, 2, 3 더하기  (0) 2017.11.30
[백준] 10164번 격자상의 경로  (0) 2017.11.29
[백준] 2839번 설탕배달  (0) 2017.11.26
[백준] 10162번 전자레인지  (1) 2017.11.24
[백준] 10836번 여왕벌  (0) 2017.11.23
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
글 보관함