경험의 기록

문제

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

 

10163번: 색종이

평면에 색깔이 서로 다른 직사각형 모양의 색종이 N장이 하나씩 차례로 놓여진다. 이때 색종이가 비스듬하게 놓이는 경우는 없다. 즉, 모든 색종이의 변은 서로 평행하거나, 서로 수직이거나 둘

www.acmicpc.net

 

풀이

0. 문제 해석

 

일반적인 구현문제로

색종이가 번호 순으로 위로 쌓이므로 

평면 배열 (1001 * 1001) 을 정의해주고 1번 색종이의 포함 범위를 다 1로,

2번 색종이의 포함 범위를 다 2로 변경하는 작업을 반복하면서

아래 번호 색종이를 덮어가면 차지하는 면적을 구할 수 있다.

 

1. 전체 코드

// [백준] 10163. 색종이 (Java)
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
	static StringTokenizer st;
	
	public static void main(String[] args) throws Exception{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		int n = Integer.parseInt(br.readLine());
		int[] count = new int[n + 1]; // n장의 색종이 각각의 면적
		int[][] arr = new int[1001][1001]; // 평면
		
		for(int i = 1; i <= n; i++) {
			st = new StringTokenizer(br.readLine());
			
			int x = Integer.parseInt(st.nextToken());
			int y = Integer.parseInt(st.nextToken());
			int width = Integer.parseInt(st.nextToken());
			int height = Integer.parseInt(st.nextToken());
			
			// 색종이가 차지하는 면적을 색종이 번호로 표시함
			for(int j = x; j < (x + width); j++) {
				for(int k = y; k < (y + height); k++) {
					arr[j][k] = i;
				}
			}
		}
		
		// 색종이가 차지하고 있는 면적 계산
		for(int i = 0; i < 1001; i++) {
			for(int j = 0; j < 1001; j++) {
				count[arr[i][j]]++;
			}
		}
		
		for(int i = 1; i <= n; i++) {
			System.out.println(count[i]);
		}
	}
}

 

반응형

공유하기

facebook twitter kakaoTalk kakaostory naver band
loading