본문 바로가기
코딩테스트/백준

[JAVA] 10163번 색종이

by PEKAH 2021. 8. 26.

문제

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

 

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

 

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

입력

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

풀이

단순한 구현문제로, 색종이에 번호를 붙여 2차원 배열에 넣어주면 해결할 수 있는 문제이다.

가로, 세로와 그 지점부터 시작하는 너비와 높이 만큼 색종이에 해당하는 번호를 넣어, 

다음 색종이가 이전 색종이를 덮는 형태를 가지게 하면 된다.

넓이는 한칸에 1씩이기 때문에, 배열의 칸 개수를 구하면 답을 구할 수 있다.

 

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class 색종이 {
	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st;
		
		int N = Integer.parseInt(br.readLine());
		int arr[][] = new int[1001][1001];
		int result[] = new int[101];
		
		for (int k = 1; k <= N; k++) {
			st = new StringTokenizer(br.readLine());
			int x = Integer.parseInt(st.nextToken());
			int y = Integer.parseInt(st.nextToken());
			int w = Integer.parseInt(st.nextToken());
			int h = Integer.parseInt(st.nextToken());
			
			for (int i = x; i < x + w; i++) {
				for (int j = y; j < y + h; j++) {
					arr[i][j] = k;
				}
			}
		}
		
		for (int i = 0; i < arr.length; i++) {
			for (int j = 0; j < arr.length; j++) {
				result[arr[i][j]]++;
			}
		}
		
		for (int i = 1; i <= N; i++) {
			System.out.println(result[i]);
		}
	}
}

 

 

 

'코딩테스트 > 백준' 카테고리의 다른 글

[JAVA] 2667번 단지 번호 붙이기  (0) 2021.08.27
[JAVA] 13300번 방 배정  (0) 2021.08.26
[JAVA] 14889번 스타트와 링크  (0) 2021.08.26
[JAVA] 2606번 바이러스  (0) 2021.08.25
[JAVA] 2635번 수 이어가기  (0) 2021.08.24

댓글