본문 바로가기

알고리즘/백준 문제풀이

[백준] 2563 색종이 (자바/java)

문제

가로, 세로의 크기가 각각 100인 정사각형 모양의 흰색 도화지가 있다. 이 도화지 위에 가로, 세로의 크기가 각각 10인 정사각형 모양의 검은색 색종이를 색종이의 변과 도화지의 변이 평행하도록 붙인다. 이러한 방식으로 색종이를 한 장 또는 여러 장 붙인 후 색종이가 붙은 검은 영역의 넓이를 구하는 프로그램을 작성하시오.

예를 들어 흰색 도화지 위에 세 장의 검은색 색종이를 그림과 같은 모양으로 붙였다면 검은색 영역의 넓이는 260이 된다.

입력

첫째 줄에 색종이의 수가 주어진다. 이어 둘째 줄부터 한 줄에 하나씩 색종이를 붙인 위치가 주어진다. 색종이를 붙인 위치는 두 개의 자연수로 주어지는데 첫 번째 자연수는 색종이의 왼쪽 변과 도화지의 왼쪽 변 사이의 거리이고, 두 번째 자연수는 색종이의 아래쪽 변과 도화지의 아래쪽 변 사이의 거리이다. 색종이의 수는 100 이하이며, 색종이가 도화지 밖으로 나가는 경우는 없다

출력

첫째 줄에 색종이가 붙은 검은 영역의 넓이를 출력한다.


처음엔 문제를 복잡하게 생각해서 각각의 정사각형 넓이에서 겹치는 부분을 빼서 더해줘야 하나 고민했는데, 

다른 블로거님의 파이썬 문제풀이를 보고 정말 간단하다고 생각이 들어 자바로 다시 구현해봤다.

 

1. 정사각형 도화지크기+1 만큼의 2차원 배열을 생성한다.

-> map[N+1][N+1]

-> 모눈종이처럼 활용하기 위함.

2. 검은색 색종이의 시작위치 x,y에서 각각 10을 더한 위치까지 map에 1을 채운다.

3. 2번을 N번 반복.

4. map 전체에서 값이 1인 경우마다, 검은색 색종이들의 면적의 합을 구하기 위한 area변수에  +1을 해준다.

5. area값 출력


package implementaion;

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

public class Bj2563_색종이 {

	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub

		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

		int N = Integer.parseInt(br.readLine());
		int[][] map = new int[101][101]; // 종이크기의 2차원 배열

		for (int i = 0; i < N; i++) {
			StringTokenizer st = new StringTokenizer(br.readLine(), " ");
			int X = Integer.parseInt(st.nextToken());
			int Y = Integer.parseInt(st.nextToken());
			fillingMap(map, X, Y);
		}

		int area = 0;
		for (int i = 0; i < map.length; i++) {
			for (int j = 0; j < map.length; j++) {
				if (map[i][j] == 1) {
					area += map[i][j];
				}
			}
		}

		System.out.println(area);

	}

	public static void fillingMap(int[][] map, int x, int y) {
		/*
		 현재 위치 (x,y)에서 정사각형 크기의 좌표까지 (newX,newY) 1로 채운다.
		 */
		int newX = x + 10;
		int newY = y + 10;

		for (int i = x; i < newX; i++) {
			for (int j = y; j < newY; j++) {
				map[i][j] = 1;
			}
		}
	}

}