[BOJ] 10163. 색종이

Developer Log·2022년 2월 28일
0

Algorithm PS

목록 보기
64/76

문제


평면에 색깔이 서로 다른 직사각형 모양의 색종이 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을 출력한다.

서브태스크

예제 입력 1

2
0 0 10 10
2 2 6 6

예제 출력 1

64
36

예제 입력 2

3
0 2 10 10
7 9 8 4
8 4 10 6

예제 출력 2

81
25
60

예제 입력 3

4
0 2 10 10
7 9 8 4
8 4 10 6
6 0 12 10

예제 출력 3

62
24
0
120

풀이


문제 유형 : 구현

  1. 색종이를 입력받는 순서대로 map[][]에 색종이의 영역을 숫자로 표시한다.
  2. 다음 색종이가 들어왔을 때 0이 아닌 수가 저장되어 있다면 (앞에서 붙인 색종이의 영역이라면) 그 색종이의 영역을 -1 하고 현재 색종이의 영역을 표시한다.
  3. 마지막 색종이까지 붙인 후 영역의 넓이를 출력한다.

*입력으로 주어지는 너비와 높이의 입력순서가 헷갈려서 틀렸었는데 주의하자

코드


import java.io.*;
import java.util.*;

public class Main_bj_10163_색종이 {

	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

		int N = Integer.parseInt(br.readLine());
		int[][] map = new int[1001][1001];

		int[] ans = new int[N + 1];
		StringTokenizer st;

		for (int i = 1; i <= N; i++) {
			st = new StringTokenizer(br.readLine(), " ");
			int y = Integer.parseInt(st.nextToken());
			int x = Integer.parseInt(st.nextToken());
			int w = Integer.parseInt(st.nextToken());
			int h = Integer.parseInt(st.nextToken());

			ans[i] = w * h;
			
			int cnt = 0;
			for (int a = y; a < y + w; a++) {
				for (int b = x; b < x + h; b++) {
					if (map[a][b] != 0) {
						cnt++;
						ans[map[a][b]] -= 1;
					}
					map[a][b] = i;
				}
			}
		}
		
	
		StringBuilder sb = new StringBuilder();
		for (int i = 1; i <= N; i++)
			sb.append(ans[i]).append("\n");
		System.out.println(sb.toString());
		br.close();

	}

}
profile
개발 공부 일지

0개의 댓글